0

在我的场景中,我想插入具有 15 列数据的 sql 语句。还有其他方法来处理插入语句的参数吗?

    public bool GetCustomersList(ref DataSet dataset, String x, String y, string z, string x1, string y1, string z1 )
    {
        MySqlConnection SQLConn = GetConnection();
        try
        {
            string get_records;
            if (SQLConn.State == ConnectionState.Closed)
            {
                SQLConn.Open();
            }
            if (searchtype == "x")
            {
                get_records = "INSERT into table values(x, y,z,x1,y1,z1);
            }
            MySqlCommand command = new MySqlCommand(get_records, SQLConn);
            MySqlDataAdapter mySqlAdapter = new MySqlDataAdapter(command);
            mySqlAdapter.Fill(dataset);

            if (SQLConn.State == ConnectionState.Open)
            {
                SQLConn.Close();
            }
            return true;
        }
        catch (Exception )
        {
            if (SQLConn.State == ConnectionState.Open)
            {
                SQLConn.Close();
            }
            return false;
        }
    }

这里的参数可能会扩展到15或更多?在asp.net中如何处理这种情况?

4

3 回答 3

1

我建议你使用:

command.Parameters.Add( ... );
于 2012-11-05T12:31:14.280 回答
1

这将做到这一点。

            List<SqlParameter> myParamList = new List<SqlParameter>();
            SqlParameter myParam = default(SqlParameter);


            myParam = new SqlParameter("@RoomID", SqlDbType.Int);
            myParam.Value = x
            myParamList.Add(myParam);

基本上,您创建参数列表,并使用新的 SqlParameter 为每个参数添加它,注意项目名称和项目类型。

然后将参数列表添加到命令中。

于 2012-11-05T12:36:24.807 回答
0

来自MSDN

使用 CreateParameter 方法创建具有指定名称、类型、方向、大小和值的新 Parameter 对象。您在参数中传递的任何值都将写入相应的 Parameter 属性。

使用内联参数是不安全的,可能会导致 sql 注入。在 .Net 中为 sql 语句提供参数的首选且更安全的方法是使用SqlParameter代替。

此外,如果你想更纯粹,同样摆脱依赖于代码中的特定实现,请改用更多接口,例如:

using (var connection = GetConnection())
{
    connection.Open();
    using (var command = connection.CreateCommand())
    {
        command.CommandType = CommandType.Text;
        command.CommandText = "INSERT into table(x, y) VALUES (@x, @y)";
        command.Parameters.Add(CreateParameter(command, "@x", x, DbType.String));
        command.Parameters.Add(CreateParameter(command, "@y", y, DbType.String));
        command.ExecuteNonQuery();
    }
}

您的自定义CreateParameter包装器具有以下实现:

private IDataParameter CreateParameter(IDbCommand command, string name, object value, DbType type)
{
    var parameter = command.CreateParameter();
    parameter.ParameterName = name;
    parameter.Value = value;
    parameter.DbType = type;
    return parameter;
}

同样,您丢弃了冗余的特定类类型,例如:MySqlCommandSqlParameter. 此外,没有必要使用try{} catch{}. Using即使抛出异常,语句也会在 dispose 时关闭连接。如果您不需要,请不要在每次请求时/之后打开和关闭连接。利用连接池

于 2012-11-05T13:48:14.163 回答