我收到错误
输入字符串的格式不正确。
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;
}
我尝试过转换,但仍然无效
答案 0 :(得分:0)
您的返回列名称听起来像是一个字符串变量,使用int type column更改它,或从代码端删除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;
}
答案 1 :(得分:0)
我认为你应该这样做,但这不是好的做法,也不安全
你的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;
}
但发送参数是最佳做法
答案 2 :(得分:0)
我会尝试总结其他答案和评论中的各种信息。
首先,您的现有代码向Sql injections
开放。这是非常 bad thing。为了避免Sql injection
使用Parametrized queries
的风险,请使用ExecuteScaler
。例如,请参阅here。
这意味着您的string
方法不应将SqlCommand
作为其参数,而应使用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;
等
然后需要更改调用代码:
{{1}}