2014-02-17 66 views
0

我建立一個內存中數據字典這些類的對象轉換字符串值SqlDbType

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"] 

這是一個對象,轉換成SqlDBT YPE值投入DDRow.DataType

我可以把它轉換成字符串:

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

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

拋出一個錯誤如上所述,因此字符串是不夠的。

我知道我可以通過轉換表例程運行字符串值來生成SqlDbType值;有沒有更短的路?

編輯------- - 根據adam的回答,這是對它進行編碼的正確方法,並且是測試產生正確結果的正確方法(將DataType替換爲DDRow中的ProviderType 定義)

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

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

    SqlDbType wrkT = wrkS.SqlDbType; 

回答

3

數據類型字段是CLR類型 - 而不是SqlDbType。 ProviderType字段是您所追求的字段。它是一個表示SQL Server數據類型的int。你可以很容易地將它轉換爲SqlDbType。下面是應該適合您的代碼的例子:(假設你的變量「O」是列名)

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。

var field = fields.First(); 

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

在您的例子所以似乎周圍傳遞參數的錯誤的方式了。同樣在你的類的例子中,DataType字段應該是SqlDbType而不是SqlDBType

+0

謝謝,這是有效的。當我建立問題時,SqlDBType是一個錯字。不確定你的錯誤方式是什麼意思,因爲DDRow的正確結果似乎產生了。 – wayfarer

+0

太棒了。在您的文章中,您似乎將s1作爲第一個參數傳遞 - 如果我沒有弄錯,那是數據類型的名稱,但它應該是參數名稱。我已經編輯了我的答案,以包含「@」符號,因爲我忘了將它放在那裏。無論哪種方式,你現在在做什麼看起來很好。 –