在SqlCommand上传递参数不起作用

时间:2013-03-30 06:30:09

标签: .net sql sql-server sql-server-2008

我正在尝试运行单个命令将行插入到我的SQL Server 2012数据库中,但是我的参数不会传递给代码。

con.Open();

string query = @"INSERT INTO [dbo].[Users](Username, Password, Role) 
                 VALUES (@u, @p, @r);";
var cmd = new SqlCommand(query, con);

cmd.Parameters.AddWithValue("@u", username);
cmd.Parameters.AddWithValue("@p", password);
cmd.Parameters.AddWithValue("@r", role);

cmd.ExecuteNonQuery();

con.Close();

我通过参数化查询获得SqlException

  

'(@ u nvarchar(4000),@ p nvarchar(4000),@ r nvarchar(1))INSERT INTO'需要参数'@u',这是未提供的。

我看到它的方式我在执行命令之前传递参数。任何人都可以帮我找出遗漏的东西吗?

2 个答案:

答案 0 :(得分:2)

您的问题不是因为您的查询,而是因为变量用户名为NULL 。当你的变量username是null时,它不会在你使用.AddwithValue时抛出任何错误,但是,它没有设置参数,这就是为什么当你使用那个参数时,它返回你的异常说没有提供参数。
使用以下代码,您可以重现您的问题并验证原因。如果你给username = string.Empty,它不会给你这个问题。


string connStr = "Data Source=localhost;Initial Catalog=Adventure;Integrated Security=SSPI";
            SqlConnection con = new SqlConnection(connStr);
            string username = null;
            string password = string.Empty;
            string role = string.Empty;
            try
            {
                con.Open();
                string query = @"INSERT INTO [dbo].[Users]" + @"(Username ,Password , Role) " + @"VALUES (@u,@p,@r);";
                var cmd = new SqlCommand(query, con);
                cmd.Parameters.AddWithValue("@u", username);
                cmd.Parameters.AddWithValue("@p", password);
                cmd.Parameters.AddWithValue("@r", role);
                cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace + ex.Message);
                con.Close();
            }

答案 1 :(得分:1)

添加:Cmd.CommandType = CommandType.StoredProcedure; 或者,Cmd.CommandType = CommandType.Text;按照要求