C# 如何使用command.Parameters.AddWithValue和value?

C# 如何使用command.Parameters.AddWithValue和value?,c#,mysql,C#,Mysql,我的代码如下: if (!string.IsNullOrEmpty(Mpdue.TheObjectPropertyNameNs)) { string sql = @String.Format(" SELECT * FROM doTable WHERE dOCode IN ('" + Mpdue.TheObjectPropertyNameNs + "'); "); using (OdbcConnection myConnectionString = new Od

我的代码如下:

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();
            }
        }
    }
 }
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();
                }
            }
        }
     }
现在我尝试在MySql查询中使用command.Parameters.AddWithValue

我一直在尝试,但找不到错误,use 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();
            }
        }
    }
}
编辑1

我的新代码如下:

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();
            }
        }
    }
 }
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();
                }
            }
        }
     }
错误:

错误[42000][MySQL][ODBC 5.1驱动程序][mysqld-5.5.24-log]您有一个 SQL语法错误;检查与您的产品相对应的手册 MySQL服务器版本,以便在“,,”附近使用正确的语法, 在第1行


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

SELECT * FROM doTable WHERE FIND_IN_SET(dOCode, ?)
然后,您需要确保参数设置为D410、D420、D430、D440的形式。因此,您可以在第一种方法中构建它,如

var paramValue = string.Join(", ", parameters);
以后再添加

command.Parameters.AddWithValue("param1", paramValue);
请注意,在_集中使用FIND_可能会对性能产生负面影响,因为它将扫描整个表,而不考虑索引。另一种方法是在查询中插入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++;
}

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

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

SELECT * FROM doTable WHERE FIND_IN_SET(dOCode, ?)
然后,您需要确保参数设置为D410、D420、D430、D440的形式。因此,您可以在第一种方法中构建它,如

var paramValue = string.Join(", ", parameters);
以后再添加

command.Parameters.AddWithValue("param1", paramValue);
请注意,在_集中使用FIND_可能会对性能产生负面影响,因为它将扫描整个表,而不考虑索引。另一种方法是在查询中插入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++;
}

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

在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());
        }

        ...
   }

试试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());
        }

        ...
   }

问题可能是在第一种方法中插入一个值列表,如“a”、“B”,而在使用AddWithValue时,只将所有值插入一个以“a.B”结尾的参数中。也许这个问题有帮助:事实上,你在一个母版页中做这件事只意味着你在错误的地方做了它,与你的问题无关,我不知道ODBC对象是否会和SQL一样工作,但是这可能是有帮助的:考虑使用DaPerter。问题可能是在第一种方法中插入一个值列表,如“a”、“B”,而在使用AddWithValue时,只将所有值插入一个以“a.B”结尾的参数中。也许这个问题有帮助:事实上,你在一个母版页中做这件事只意味着你在错误的地方做了它,与你的问题无关,我不知道ODBC对象是否会和SQL一样工作,但是这可能是有帮助的:考虑使用DaPerter。谢谢,但是新的错误现在是错误[HY001][MySQL][ODBC 5.1驱动程序][mysqld-5.5.24-log]内存分配错误参数是'D410','D430','D440','D420'我在编辑2中的新代码在我的第一个问题中,谢谢-@ChevyMarkSunderland也许你可以检查以下内容:你有$in.AddWithValue$param{index},param;?参数在参数中使用后不需要引号。参数有引号吗?参数中没有引号。。。@Hamamel回复上的代码在我的情况下运行…谢谢,但是新的错误现在是错误[HY001][MySQL][ODBC 5.1驱动程序][mysqld-5.5.24-log]内存分配错误参数是'D410'、'D430'、'D440'、'D420'。在我的第一个问题中,我在编辑2中的新代码,谢谢-@chevymarks,也许你可以检查一下:你有$in.AddWithValue$param{index},param;?参数在参数中使用后不需要引号。参数有引号吗?参数中没有引号。。。@hamamel回复上的代码在我的案例中起作用。。。