将字符串值转换为SqlDbType

时间:2014-02-17 23:42:56

标签: c# sql-server

我正在用这些类对象构建一个内存数据字典

public class DDRow
{
    public string ColumnName { get; set; }
    public SqlDBType DataType { get; set; }
    public int ColumnSize { get; set; }
    public bool IsIdentity { get; set; }
    public bool AllowDBNull { get; set; }
 }

...在子程序中,从SqlReader.GetSchema调用中填充它

//Retrieve column schema into a DataTable.
     schemaTable = myReader.GetSchemaTable();
     DDRow wrkRow = null;
     //For each field in the table...
      foreach (DataRow myField in schemaTable.Rows)
       {
            wrkRow = new DDRow(); 
            wrkRow.ColumnName = Convert.ToString(myField["ColumnName"]);  // string
            wrkRow.DataType = myField["DataType"];   //SqlDbType 

...除了我无法弄清楚如何转换

之外似乎都有效
myField["DataType"]

这是一个对象,放入一个SqlDBType值放入DDRow.DataType

我可以将其转换为字符串:

   string s1 = Convert.ToString(myField["DataType"]);

但是

   SqlParameter p = new SqlParameter(s1, o);
   SqlDbType q = p.SqlDbType;  // <-- error here.

如上所示抛出错误,因此字符串不够。

我知道我可以通过转换表例程运行字符串值来生成SqlDbType值;有没有更短的路?

编辑------- - 根据下面的亚当答案,这是编码它的正确方法,以及测试正确结果的正确方法(用DDRow中的ProviderType替换DataType) 定义)

  wrkRow.ProviderType = (SqlDbType)(int)myField["ProviderType"];

  SqlParameter wrkS = new SqlParameter("@ABC",wrkRow.ProviderType,8);

  SqlDbType wrkT = wrkS.SqlDbType;

1 个答案:

答案 0 :(得分:3)

DataType字段是CLR类型 - 而不是SqlDbType。 ProviderType字段是您追求的字段。它是一个表示SQL Server数据类型的int。您可以轻松地将其转换为SqlDbType。以下是一个适合您的代码的示例:

var reader = cmd.ExecuteReader();
var schemaTable = reader.GetSchemaTable();
var fields = new List<DDRow>();

foreach (DataRow myField in schemaTable.Rows)
{
    fields.Add(new DDRow()
    {
        ColumnName = Convert.ToString(myField["ColumnName"]),
        DataType = (SqlDbType)(int)myField["ProviderType"]
    });
}

然后你可以这样做来创建你的SqlParameter(假设你的变量'o'是列名)。

var field = fields.First();

SqlParameter p = new SqlParameter("@" + field.ColumnName, field.DataType);
SqlDbType q = p.SqlDbType;

在你的例子中,似乎也错误地传递了参数。同样在您的类示例中,DataType字段应为SqlDbType而不是SqlDBType