【问题标题】:How to use command.Parameters.AddWithValue with value?如何将 command.Parameters.AddWithValue 与值一起使用?
【发布时间】:2019-07-15 08:48:05
【问题描述】:

我的代码如下:

if (!string.IsNullOrEmpty(Mpdue.TheObjectPropertyNameNs))
{

    string sql = @String.Format(" SELECT * FROM doTable WHERE dOCode IN ('" + Mpdue.TheObjectPropertyNameNs + "'); ");

    using (OdbcConnection myConnectionString =
        new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString))
    {
        using (OdbcCommand command =
            new OdbcCommand(sql, myConnectionString))
        {
            try
            {
                command.Connection.Open();

                using (OdbcDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            Response.Write(reader["dOCode"].ToString() + "<br />");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException("operation failed!", ex);
            }
            finally
            {
                command.Connection.Close();
            }
        }
    }
 }

输出:

D410
D420
D430
D440

现在我尝试在MySql 查询中使用command.Parameters.AddWithValue

我一直在尝试找不到错误,使用command.Parameters.AddWithValue时输出为空,为什么?

if (!string.IsNullOrEmpty(Mpdue.TheObjectPropertyNameNs))
{

    string sql = @String.Format(" SELECT * FROM doTable WHERE dOCode IN (?); ");

    using (OdbcConnection myConnectionString =
        new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString))
    {
        using (OdbcCommand command =
            new OdbcCommand(sql, myConnectionString))
        {
            try
            {
                command.Connection.Open();
                command.Parameters.AddWithValue("param1", Mpdue.TheObjectPropertyNameNs);

                using (OdbcDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            Response.Write(reader["dOCode"].ToString() + "<br />");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException("operation failed!", ex);
            }
            finally
            {
                command.Connection.Close();
            }
        }
    }
}

编辑#2

var parameters = new string[Mpdue.TheObjectPropertyNameNs.Length];
var paramValue = string.Join(", ", parameters);


string sql = string.Format("SELECT * FROM doTable WHERE dOCode IN ({0})", string.Join(", ", parameters.Select(x => "?")));

int index = 0;
foreach (var param in parameters)
{
   command.Parameters.AddWithValue("param{index}", param);
   index++;
}

编辑#1

我的新代码如下:

if (!string.IsNullOrEmpty(Mpdue.TheObjectPropertyNameNs))
{
   var parameters = new string[Mpdue.TheObjectPropertyNameNs.Length]; 

   string sql = @String.Format(" SELECT * FROM doTable WHERE dOCode IN ({0})", string.Join(", ", parameters));

        using (OdbcConnection myConnectionString =
            new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString))
        {
            using (OdbcCommand command =
                new OdbcCommand(sql, myConnectionString))
            {
                try
                {
                    command.Connection.Open();

                    for (int i = 0; i < Mpdue.TheObjectPropertyNameNs.TrimStart('\'').TrimEnd('\'').Length; i++)
                    {
                       parameters[i] = string.Format("param1{0}", i);
                       command.Parameters.AddWithValue(parameters[i], Mpdue.TheObjectPropertyNameNs.TrimStart('\'').TrimEnd('\'')[i]);
                    }                    

                    using (OdbcDataReader reader = command.ExecuteReader())
                    {
                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                Response.Write(reader["dOCode"].ToString() + "<br />");
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new ApplicationException("operation failed!", ex);
                }
                finally
                {
                    command.Connection.Close();
                }
            }
        }
     }

错误:

ERROR [42000] [MySQL][ODBC 5.1 Driver][mysqld-5.5.24-log]你有一个 SQL 语法错误;检查与您对应的手册 MySQL 服务器版本,用于在 ' , , , , , , , 附近使用正确的语法 , , , , , , , , , , , , , , , , , , ) 在第 1 行

【问题讨论】:

标签: c# mysql


【解决方案1】:

在 C# 中试试这个。希望对您有所帮助。

    if (!string.IsNullOrEmpty(Mpdue.TheObjectPropertyNameNs))
    {
        var paramValue = string.Join(", ", Mpdue.TheObjectPropertyNameNs);

        string sql = string.Format("SELECT * FROM doTable WHERE dOCode IN ({0})", paramValue.ToString());

        ...

        foreach (var param in paramValue)
        {
           command.Parameters.AddWithValue("param1", param.ToString());
        }

        ...
   }

【讨论】:

    【解决方案2】:

    为了解决这个问题,您可以将查询更改为以下字符串:

    SELECT * FROM doTable WHERE FIND_IN_SET(dOCode, ?)
    

    然后,您需要确保您的参数以D410, D420, D430, D440 的形式设置。所以你可以像第一种方法一样构建它,比如

    var paramValue = string.Join(", ", parameters);
    

    稍后再添加

    command.Parameters.AddWithValue("param1", paramValue);
    

    请注意,使用FIND_IN_SET 可能会对性能产生负面影响,因为它会扫描整个表而不考虑索引。另一种方法是将 n 个参数插入到查询中,然后单独添加每个参数,例如

    string sql = string.Format("SELECT * FROM doTable WHERE dOCode IN ({0})", string.Join(", ", parameters.Select(x => "?")));
    // ...
    int index = 0;
    foreach(var param in parameters)
    {
      command.Parameters.AddWithValue($"param{index}", param);
      index++;
    }
    

    如果预期的参数数量不太高,这是一种可行的方法。

    【讨论】:

    • 谢谢,但现在出现新错误 ERROR [HY001] [MySQL][ODBC 5.1 Driver][mysqld-5.5.24-log]内存分配错误
    • 参数为'D410','D430','D440','D420'
    • 我在第一个问题中的 Edit #2 中的新代码,谢谢-
    • @ChevyMarkSunderland 也许您可以检查以下内容:.AddWithValue($"param{index}", param); 中是否有 $param 在参数中使用后不需要引号。 param 有引号吗?
    • param 中没有引号 ... @Hamamelis 在我的情况下工作的回复中发布的代码...
    猜你喜欢
    • 2014-01-02
    • 2012-05-20
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2012-06-20
    • 1970-01-01
    相关资源
    最近更新 更多