使用参数

时间:2017-08-21 12:55:52

标签: c# mysql

我正在创建一个使用一个或多个参数执行查询的方法。

代码:

public static IEnumerable<T> ExecuteQueryWithParameters<T>(string Query, string ConnectionString, string[] ParametersArray, string[] ValuesArray)
{
    using (MySqlConnection Connection= new MySqlConnection(ConnectionString))
    {
        using (var cmd = new MySqlCommand(Query, Connection))
        {
            for (int i = 0; i < ParametersArray.Length; i++)
            {
                cmd.Parameters.AddWithValue(ParametersArray[i], ValuesArray[i]);
            }

            Connection.Open();
            return Connection.Query<T>(Query);
        }
    }
}

Tempsave表格结构:

+------------------------------+
|Id|Localization|Items|Quantity|
+------------------------------+

工作原理:

调用时,该方法将接收4个参数:

  1. A query(例如:SELECT * FROM TempSave WHERE Localization = @Localization
  2. 连接字符串(例如:server=localhost; database=wintestbeta;user=root; password=;
  3. 包含一个或多个参数的字符串数组(它们如下所示:@Parameter1
  4. 包含一个或多个值的字符串数组
  5. 然后它将创建一个名为MySqlConnection的{​​{1}}类型的新变量,其中包含一个参数Connection

    之后,它将创建另一个名为ConnectionString的变量类型MySqlCommand,其中包含两个参数,一个是查询,另一个是连接。

    然后它将进入一个大小为cmd长度的for循环,在for循环中它将向ParametersArray添加一个新参数,其中包含两个参数cmd和索引等于ParameterArray,而i的索引也等于ValueArray

    然后它将打开一个连接并执行查询,它将从它将返回的查询中收到什么。

    用于调试的代码:

    i

    问题:

    到达

    时执行代码
    IEnumerable<TempSave> _CheckTemp;
    
    string Check_TempSave = "SELECT * FROM tempsave WHERE Localization=@Localization";
    
    string[] Parameters = new string[] { "@Localization" };
    string[] Values = new string[] { _Save.Localization };
    
    _CheckTemp = SQL.ExecuteQueryWithParameters<TempSave>(Check_TempSave, SQL.ConnectionString, Parameters, Values);
    

    并导致以下错误:

      

    命令执行期间遇到致命错误。

    调试时我检查过,参数和值都只有一个值:

    return Connection.Query<T>(Query);
    

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是使用for循环而不是使用AddWithValue,而是将每个@Parameter替换为让方法如下所示的值:

    public static IEnumerable<T> ExecuteQueryWithParameters<T>(string Query, string ConnectionString, string[] ParametersArray, string[] ValuesArray)
    {
        using (MySqlConnection Connection = new MySqlConnection(ConnectionString))
        {
                for (int i = 0; i < ParametersArray.Length; i++)
                {
                    //Replace all @Parameters
                    Query = Query.Replace(ParametersArray[i], ValuesArray[i]);
                }
                Connection.Open();
                return Connection.Query<T>(Query);
        }
    }

也许这不是最好的方法,但没有人回答我的问题,这是我唯一的解决方案。