2010-06-15 116 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)));