2012-01-06 62 views
9

上午在C#中使用Prepared Statement。在準備好的語句中使用SqlDBType.Decimal C#

SqlCommand inscommand = new SqlCommand(supInsert, connection); 
inscommand.Parameters.Add("@ordQty", SqlDbType.Decimal,18); 
inscommand.Prepare(); 
u = inscommand.ExecuteNonQuery(); 

上面的代碼拋出異常如下:

SqlCommand.Prepare方法需要類型「十進制」有一個明確設置Precision和Scale參數。

編輯:如何避免這種異常

+0

你有問題要問?你對這個錯誤有什麼不清楚的地方? – Oded 2012-01-06 13:06:39

+0

嗨Oded,是的我得到了上述例外設置精度和規模。 – 2012-01-06 13:09:23

+0

而且?什麼是不明確的錯誤?您需要設置精度和比例。 – Oded 2012-01-06 13:10:48

回答

28

下將設置一個小數,提供高精度和18 8級(十進制(18,8))

SqlCommand insertCommand= new SqlCommand(supInsert, connection); 
insertCommand.Parameters.Add("@ordQty", SqlDbType.Decimal,18); 

insertCommand.Parameters["@ordQty"].Precision = 18; 
insertCommand.Parameters["@ordQty"].Scale = 8; 

insertCommand.Prepare(); 
u = insertCommand.ExecuteNonQuery(); 
3

您將有明確定義精度併爲此參數縮放。

SqlParameter ordQty = cmd.Parameters.Add("@ordQty", SqlDbType.Decimal); 
ordQty.Precision = x; //Replace x with what you expect in Sql Sp 
ordQty.Scale = y; //Replace y with what you expect in Sql Sp 
ordQty.Value = 18; //Set value here 
inscommand.Parameters.Add(ordQty); 
4

試試這個:

SqlParameter parameter = new SqlParameter("@ordQty", SqlDbType.Decimal); 
parameter.Precision = 18; 
parameter.Scale = 0; 
parameter.Value = YOURVALUEHERE; 
inscommand.Parameters.Add(parameter); 
6

作爲例外指出的那樣,你必須爲了使用decimal類型作爲參數明確設置SqlParameter.PrecisionSqlParameter.Scale性能。

假設您的SQL字段的類型爲decimal(18,8)。要做到這一點內嵌的方式是使用大括號初始化爲您的SqlParameter,同時將它添加到SqlParameterCollection,如下所示:

cmd.Parameters.Add(new SqlParameter("@ordGty", SqlDbType.Decimal) { 
    Precision = 18, Scale = 8 }); 

你也可以做

cmd.Parameters.Add(new SqlParameter("@ordGty", SqlDbType.Decimal) { 
    Precision = 18, Scale = 8}).Value = 0.4m; // or whatever 

添加值,如果你需要一個。你甚至可以做

cmd.Parameters.Add(new SqlParameter("@ordGty", SqlDbType.Decimal) { 
    Precision = 18, Scale = 8, Value = 0.4m /* or whatever */}); 

如果你願意。 Brace initialization真的很強大。注意:我意識到這是一個老問題,但我認爲這種形式比創建對象時更具可讀性,同時將其添加到列表中,然後設置比例和精度。爲了後人! (因爲這是一個高的谷歌搜索結果)