2010-06-15 61 views
1

我在C#類下面的結構構建逗號在C#中分隔字符串從結構

public struct Employee 
     { 
      public const string EMPID = "EMP_ID"; 
      public const string FName = "FIRST_NAME"; 
      public const string LNAME = "LAST_NAME"; 
      public const string DEPTID = "DEPT_ID"; 

     } 

有一個簡單的方法來建立一個字符串如下

const string mainquery="INSERT INTO EMP(EMP_ID,FIRST_NAME,LAST_NAME,DEPT_ID) VALUES(:EMP_ID,:FIRST_NAME,:LAST_NAME,:DEPT_ID)" 

而不是做如下 然後連接它。

const string EMP_COLS= 
       EMPLOYEE.EMPID + "," + 
       EMPLOYEE.FNAME + "," + 
     EMPLOYEE.LNAME + "," + 
       EMPLOYEE.DEPTID; 

      const string EMP_Values= 
       EMPLOYEE.EMPID + ":" + 
       EMPLOYEE.FNAME + ":" + 
     EMPLOYEE.LNAME + ":" + 
       EMPLOYEE.DEPTID; 

回答

4

你可以嘗試這樣的事:

StringBuilder sb = new StringBuilder(); 
var fields = typeof(Employee).GetFields(); 
for (int i = 0; i < fields.Length; ++i) 
{ 
    sb.Append(fields[i].GetValue(new Employee())); 
    if (i < fields.Length - 1) 
    { 
     sb.Append(','); 
    } 
} 

string result = sb.ToString(); 
// The above will be "EMP_ID,FIRST_NAME,LAST_NAME,DEPT_ID" 

編輯:注意上面我假設你已經得到了using指令兩種System.ReflectionSystem.Text

+0

+1我忘了'GetFields',比我的回答容易。 – 2010-06-15 13:41:03

+1

但是會保證順序一致嗎?如果由於某種原因而改變了排除的順序並將數據插入到錯誤的列中,那將會很糟糕。 – Walter 2010-06-15 13:56:12

+0

這是一個優秀的點沃爾特 - 沒有任何保證。這就是說,我相信有一個隱含的*「保證」,即順序在結構中是按照定義的順序排列的。對於你來說,這裏不是擲骰子的地方。 – cliss 2010-06-15 14:02:27

0

您將需要某種映射字典,如here,或者你可以只使用一些ORM工具進行映射你。

1

如果結構持有隻讀屬性而不是公共常量,則可以使用反射來完成。你可以撥打電話Type.GetProperties,循環瀏覽所有的數據,然後調用它們來獲取數值並將數值插入List<string>,然後將它們與string.Join(", ", myList);或其他東西一起加入。
然後,你會得到字符串的第一部分爲EMP_ID, FIRST_NAME, LAST_NAME, DEPT_ID,你需要複製一份,並根據需要添加:,你會有兩個部分。

0
 string[] values = new[] { 
      "EMP_ID", 
      "FIRST_NAME", 
      "LAST_NAME", 
      "DEPT_ID", 
     }; 

     var columns = string.Join(",", values); 
     var parameters = ":" + string.Join(",:", values); 

     var sql = string.Format("INSERT INTO EMP({0}) VALUES({1})", 
      columns, 
      parameters); 
1

可以使用string.Format(string format, object[] arg)方法如下:

string query = string.Format("INSERT INTO EMP({0},{1},{2},{3}) VALUES(:{0},:{1},:{2},:{3})", 
       Employee.EMPID, 
       Employee.FNAME, 
       Employee.LNAME, 
       Employee.DEPTID); 

希望有所幫助。

0
string[] cols = typeof(Employee).GetFields() 
       .Select(f => f.GetValue(null).ToString()).ToArray(); 

Console.WriteLine(string.Format(
     "INSERT INTO EMP({0}) VALUES(:{1})", 
     string.Join(",", cols), 
     string.Join(",:", cols)));