从类中调用方法时参数化数据输入

时间:2015-08-09 07:48:44

标签: c# sql wpf ado.net

我试图通过WPF窗口插入一些数据,我想参数化输入。我怎样才能做到这一点?到目前为止我的代码:

public int insertdetails(string query)
    {
        SqlTransaction trans = null;
        try
        {
            trans = getconnection().BeginTransaction("trInsert");
            SqlCommand cmd = new SqlCommand("", con, trans);
            cmd.CommandText = query;
            int a = cmd.ExecuteNonQuery();
            if (a > 0)
            {
                trans.Commit();
                return 1;
            }
            else
            {
                trans.Rollback("trInsert");
                return 0;
            }
   //....below is the code for button save....//




 dataaccess da = new dataaccess();   //..this is a class with insert method..//
        res = da.insertdetails("insert into staff_table values ('" + txtid.text + "','"+ txtname.text + "','" + txtlname.text + "'");
        if(res > 0)
            messagebox.show("saved!");
        else
            messagebox.show("error!");

3 个答案:

答案 0 :(得分:0)

您的意思是String.Format吗?

da.insertdetails(String.Format("insert into staff_table values ('{0}','{1}','{2}')",txtid.text,txtname.text,txtlname.text));

在C#6中,您可以使用String Interpolation功能将$置于字符串的开头。

da.insertdetails($"insert into staff_table values ('{txtid.text}','{txtname.text}','{txtlname.text}')");

答案 1 :(得分:0)

您需要替换insertdetails方法来接受参数和命令。使用 SqlParameter 类是避免SQL注入的方法:

用法:

insertdetails("insert into staff_table", "A", "B", "C");

insertdetails("insert into staff_table (col1, col2)", "A", "B");

<强>代码:

public int insertdetails(string command, params string[] parameters)
{
    SqlTransaction trans = null;

    try
    {
        trans = getconnection().BeginTransaction("trInsert");
        SqlCommand sqlCom = new SqlCommand()
        {
            Connection = con,
            Transaction = trans
        };


        // Start Building the Parameterized Command
        string insertedValues = String.Empty;

        if (parameters.Any())
        {
            int counter = 1;
            foreach (var paramVal in parameters)
            {
                string paramName = "@param" + counter++;

                sqlCom.Parameters.AddWithValue(paramName, paramVal);

                insertedValues += paramName + ",";
            }

            insertedValues = insertedValues.TrimEnd(',');

            insertedValues = String.Format(" VALUES ( {0} )", insertedValues);
        }

        sqlCom.CommandText = String.Format("{0} {1}", command, insertedValues);

        int resCount = sqlCom.ExecuteNonQuery();

        if (resCount > 0)
        {
            trans.Commit();
            return 1;
        }
        else
        {
            trans.Rollback("trInsert");
            return 0;
        }
    }
    catch (Exception ex)
    {
        // Exception Handling
        if (trans != null)
            trans.Rollback();
        return 0;
    }
}

答案 2 :(得分:0)

使用SqlParameter参数化SqlCommand query的可能解决方案如下所示:

首先为重复代码创建一个通用方法,创建SqlParameter对象(在你的情况下它看起来像所有参数都是string / varchar类型):

public SqlParameter createParameter(string name, string value)
    {
        // create the named parameter
        var sqlParameter = new SqlParameter(name, SqlDbType.VarChar);
        // set the desired value
        sqlParameter.Value = value;
        return sqlParameter;
    }

然后将sql命令编写为普通查询,参数名称为palceholders,并在执行之前将参数添加到SqlCommand对象:

dataaccess da = new dataaccess();
var sqlQuery = new SqlCommand("insert into staff_table values ('@id','@name','@lname')");
sqlQuery.Parameters.Add(createParameter("id", txtid.text));
sqlQuery.Parameters.Add(createParameter("name", txtname.text));
sqlQuery.Parameters.Add(createParameter("lname", txtlname.text));
res = da.insertdetails(sqlQuery);
if(res > 0)
    messagebox.show("saved!");
else
    messagebox.show("error!");

@符号标记sql查询中的参数。 ADO.NET框架在参数列表中搜索名称,并使用转义值替换所有出现的名称。您的代码可以安全地防止SQL注入尝试。 您可能必须稍微更改insertdetails方法,以便仅将查询和参数或SqlCommand作为参数,而不仅仅是sql查询。

你有很多选择。一种方法是将query参数更改为SqlCommand

public int insertdetails(SqlCommand cmd)
    {
        SqlTransaction trans = null;
        try
        {
            trans = getconnection().BeginTransaction("trInsert");
            cmd.Transaction = trans;
            int a = cmd.ExecuteNonQuery();
            if (a > 0)
            {
                trans.Commit();
                return 1;
            }
            else
            {
                trans.Rollback("trInsert");
                return 0;
            }

现在您可以使用我的答案中的其他代码。另一种可能性是改变你的代码,如@ user3185569的答案。两种变体都有利有弊。