[英]Input string was not in a correct format error not getting resolved for class function
我收到錯誤信息
輸入的字符串格式不正確。
newRow["col_frm_bin_id"] = CF.ExecuteScaler("Select location_name from wms_storage_bin where mkey = " + e.Record["from_bin"] + "");
public string ExecuteScaler(string StrQuery)
{
DB.EConnection();
cmd = new SqlCommand(StrQuery, DB.conn);
cmd.Connection = DB.conn;
int val=Convert.ToInt32(cmd.ExecuteScalar());
DB.conn.Close();
string ret = val.ToString();
return ret;
}
我嘗試進行轉換,但仍然沒有用
您的返回列名稱聽起來像是一個字符串變量,使用int type列對其進行更改,或者從代碼端刪除Convert.ToInt32
public string ExecuteScaler(string StrQuery)
{
DB.EConnection();
cmd = new SqlCommand(StrQuery, DB.conn);
cmd.Connection = DB.conn;
string ret=cmd.ExecuteScalar().ToString();
DB.conn.Close();
return ret;
}
我認為您應該這樣做,但這不是好習慣,也不安全
您的mkey值應介於引號之間
mkey = '" + e.Record["from_bin"] + "'
newRow["col_frm_bin_id"] = CF.ExecuteScaler("Select location_name from wms_storage_bin where mkey = '" + e.Record["from_bin"] + "'");
public string ExecuteScaler(string StrQuery)
{
DB.EConnection();
cmd = new SqlCommand(StrQuery, DB.conn);
cmd.Connection = DB.conn;
int val=Convert.ToInt32(cmd.ExecuteScalar());
DB.conn.Close();
string ret = val.ToString();
return ret;
}
但是發送參數是最佳做法
我將嘗試總結其他答案和評論中的各種信息。
首先,您現有的代碼可用於Sql injections
。 這是非常 不好的事情 。 為了避免Sql injection
的風險,您應該使用Parametrized queries
。 例如在這里看到 。
這意味着您的ExecuteScaler
方法不應將string
作為其參數,而應使用SqlCommand
(我已更正了scalar的拼寫):
public string ExecuteScalar(SqlCommand query) { ... }
您當前的ExecuteScaler
實現也有泄漏SqlConnetions
風險。 如果此方法在DB.conn.Close()
行之前引發了異常,則不會關閉連接。 例如,就您在問題中描述的情況而言,以下幾行是主要嫌疑人 :
int val = Convert.ToInt32(cmd.ExecuteScalar());
當前調用該方法時,您似乎正在從數據庫中獲取string
的內容。 除非該字符串可轉換為Int32
,否則此行將引發異常,並且連接不會關閉。 要解決此問題,您至少應添加一個try { ... } finally { ... }
塊:
public string ExecuteScalar(SqlCommand query)
{
try
{
DB.EConnection();
query.Connection = DB.conn;
string ret = query.ExecuteScalar().ToString();
return ret;
}
finally
{
if(DB.conn.State == ConnectionState.Open)
DB.conn.Close();
}
}
我還建議您為不同的期望返回類型創建單獨的ExecuteScalar
版本。 也許:
public string GetStringScalar(SqlCommand query)
public int GetInt32Scalar(SqlCommand query)
等等
然后需要更改調用代碼:
string locName = null;
using (SqlCommand locNameCommand = new SqlCommand(@"
select location_name
from wms_storage_bin
where mkey = @mkey
"))
{
locNameCommand.Parameters.AddWithValue("mkey", e.Record["from_bin"]);
locName = GetStringScalar(locNameCommand);
}
newRow["col_frm_bin_id"] = locName;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.