【问题标题】:C# Passing parameters to stored procedure with EXEC queryC# 使用 EXEC 查询将参数传递给存储过程
【发布时间】:2014-10-08 05:42:10
【问题描述】:

我正在尝试以 EXEC 格式将参数从我的程序传递到存储过程。以下是我的代码

public void button1_Click(object sender, EventArgs e)
        {
            frm = new FrmLogin();

            OleDbConnection conn = new OleDbConnection("File Name=E:\\Vivek\\License Manager\\License Manager\\login.udl");

            try
            {

                conn.Open();

                string user = username.Text;
                string pass = password.Text;

                string query = "EXEC dbo.checkuser"' + username.Text'" + " " + "'password.Text'"";

                OleDbCommand cmd = new OleDbCommand(query,conn);


                cmd.ExecuteNonQuery();

                // Retrieve the return value

                string result = query.ToString();

                MessageBox.Show(result);



             }

             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
             }


              conn.Close();

         }

我应该在string query=""中写什么?,我试图将用户名和密码作为参数传递给存储过程,一旦查询执行并返回结果,我会将其存储在另一个名为result的变量中。我我做对了吗?我是 C# 新手

请推荐,

谢谢

【问题讨论】:

  • 这里有一个隐藏的原因来解释为什么需要使用EXEC?
  • 顺便说一下,如果你使用的是SqlServer,你也可以使用SqlCommand。这可能比 OleDbCommand 有更好(更快)的结果。

标签: c# sql .net sql-server


【解决方案1】:

使用来自用户输入的动态插入段来构建命令文本是非常危险的,并且会让您面临SQL 注入

下面是一个细微的变化,参数化这些字符串。这种方法更安全。

string query = "dbo.checkuser";

OleDbCommand cmd = new OleDbCommand(query,conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@username", username.Text);
cmd.Parameters.AddWithValue("@password", password.Text);

注意:此更新版本将命令设置为存储过程,而不是纯文本。

【讨论】:

  • 顺便说一句,您没有询问这部分,但我注意到检索查询输出 (string result = query.ToString();) 的代码无法按预期工作。如果您可以描述您期望的输出,我们也可以帮助您完成这部分。例如,如果您的存储过程通过 SELECT 语句返回单个字符串值,那么 string result = (string)cmd.ExecuteScalar(); 之类的可能会起作用。
  • 谢谢 Troy...除了 AddWithValues 还有其他技术吗?
  • 是的,在官方 MSDN 文档中还列出了 OleDbParameterCollection 的其他替代方案(cmd.Parameters 是其中的一个实例)。
【解决方案2】:

试试这个

OleDbCommand cmd = new OleDbCommand("StoredPorcedureName",conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameter.AddWithValue("@user", username.Text);
cmd.Parameter.AddWithValue("@pwd", password.Text);
cmd.ExecuteNonQuery();

【讨论】:

    【解决方案3】:

    除了您的查询字符串外,乍一看还可以。改为:

    string query = "EXEC dbo.checkuser '" + username.Text "', '" + password.Text + "'";
    

    可能会更好。

    编辑

    是的,根据 cmets 关于 SQL 注入的说法,Troy 的回答要好得多。

    为了在其他情况下可能使用的完整性,您可以通过尝试以下方法来避免使用此方法进行 SQL 注入:

    string query = "EXEC dbo.checkuser '" + username.Text.Replace("'", "''") "', '" + password.Text.Replace("'", "''") + "'";
    

    【讨论】:

    • 容易发生 SQL 注入。
    猜你喜欢
    • 2017-12-29
    • 2016-04-05
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多