簡體   English   中英

輸入字符串格式不正確,無法為類函數解決

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM