输入字符串格式不正确错误无法解析类函数

时间:2017-01-20 12:18:04

标签: c# asp.net

我收到错误

  

输入字符串的格式不正确。

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;
}

我尝试过转换,但仍然无效

3 个答案:

答案 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}}