我正在用这些类对象构建一个内存数据字典
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;
答案 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