2012-06-29 178 views
-1

我希望你們能幫我弄清楚爲什麼會發生這種情況。我一直在試圖弄清楚這件事。將行添加到數據表時出現奇怪的錯誤

下面直接是一個例子從我的代碼(跟無聊位切出)

...(Set up the connection and command, initialize a datatable "dataTable")... 

using (SqlDataReader reader = cmd.ExecuteReader()) 
{ 
    //Query storage object 
    object[] buffer = new object[reader.FieldCount]; 

    //Set the datatable schema to the schema from the query 
    dataTable = reader.GetSchemaTable(); 


    //Read the query 
    while (reader.Read()) 
    { 
    reader.GetValues(buffer); 
    dataTable.Rows.Add(buffer); 
    } 
}       

的錯誤是

輸入字符串的不中NumericScale正確format.Couldn't店柱。預期的類型是Int16。

如由模式返回的特定列中的數據類型(由列排序)

  1. System.Data.SqlTypes.SqlInt32
  2. System.Data.SqlTypes.SqlInt32
  3. 系統。 Data.SqlTypes.SqlByte
  4. System.Data.SqlTypes.SqlMoney
  5. System.Data.SqlTypes.SqlString
  6. System.Data.SqlTypes.SqlGuid
  7. System.Data.SqlTypes.SqlDateTime

這樣看來,這應該是在列#5的數據實際上是出現在3#列。但這是純粹的猜測。

我所知道的是,爲了將數據表「動態地」用於可以繼續任意數量的不同類型數據的查詢,最佳路徑是使用GetSchemaTable()來檢索它。

我看到了在調試器

當我投進調試我看了一下DataTable的類型從模式內置主場迎戰類型從reader.GetValues返回到對象()。 他們完全一樣

看起來好像dataTable.Rows.Add(緩衝區)正在從應該從哪裏添加幾列。但這不應該是可能的。特別是在讀者構建的模式是直接。我在ExecuteReader()中使用了諸如「CommandBehavior.KeyInfo」之類的選項,並且仍然發生相同的錯誤。

注意:我需要以這種方式運行查詢以使最終用戶能夠中止查詢。請不要建議我放棄這個並使用SqlDataAdapter或DataTable.Load()解決方案。

我非常感謝任何幫助。謝謝!

+0

當然#TYPE#不是敏感信息嗎?你可以給我們的信息越多越好。 –

+0

添加了更多細節。認爲很多規範是不必要的。 –

回答

1

我很抱歉,但GetSchemaTable檢索模式給定表和GetValues檢索實際行數據。例如。您的dataTable將包含列名稱,列類型等(請參閱MSDN reference),而您的buffer將包含其表示方式與dataTable不同的實際數據。

+0

現在想通了。您需要兩個數據表,然後引用包含要查找的內容的列/行對。謝謝。 –

0

你爲什麼不只是使用:

dataTable.Fill(); 

你爲什麼手動加載它一行在同一時間?

2

方法DbDataReader.GetSchemaTable()返回元數據包含列名和類型表。這不是一個人們可以期待的空桌子。欲瞭解更多詳情,請參見MSDN

0

請檢查你所插入的列GUID數據類型。我得到了同樣的錯誤,發現在從csv文件讀取記錄後插入記錄時,在csv文件中有幾個空白空間。

相關問題