SqlCommand.Prepare方法要求所有可变长度参数都具有显式设置的非零大小

时间:2013-11-15 18:01:57

标签: c# asp.net sql-server database parameterized-query

我试图通过代码在SQL数据库中插入一些值:

var connstring = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString; ;
var conn = new SqlConnection(connstring);
conn.Open();
SqlCommand command = new SqlCommand("INSERT INTO [Trainer] (Name, ID, [Trainee Counter], image, [Mobile NO], Email, Password) VALUES(:v1, :v2,:v3,:v4,:v5,:v6,:v7);", conn);

command.Parameters.Add(new SqlParameter("v1", SqlDbType.VarChar));
command.Parameters.Add(new SqlParameter("v2", SqlDbType.Int));
command.Parameters.Add(new SqlParameter("v3", SqlDbType.Int));
command.Parameters.Add(new SqlParameter("v4", SqlDbType.VarBinary));
command.Parameters.Add(new SqlParameter("v5", SqlDbType.VarChar));
command.Parameters.Add(new SqlParameter("v6", SqlDbType.VarChar));
command.Parameters.Add(new SqlParameter("v7", SqlDbType.VarChar));
command.Prepare();
command.Parameters[0].Value = TextBox1.Text;
command.Parameters[1].Value = 0;
command.Parameters[2].Value = 0;
command.Parameters[3].Value = FileUpload1.FileBytes;
command.Parameters[4].Value = TextBox3.Text;
command.Parameters[5].Value = TextBox4.Text;
command.Parameters[6].Value = TextBox5.Text;


command.ExecuteNonQuery();

conn.Close();

但我总是得到这个例外:

  

SqlCommand.Prepare方法需要所有可变长度参数   有明确设置的非零大小。

实际上我已经使用PostgreSQL从我的一个C ++ / CLI项目移植了这个代码,它在该项目上工作正常。

4 个答案:

答案 0 :(得分:3)

您应该设置可变长度参数的最大大小

替换所有varchar(和varbinary)参数:

command.Parameters.Add(new SqlParameter("v1", SqlDbType.VarChar));

使用:

command.Parameters.Add(new SqlParameter("v1", SqlDbType.VarChar, 50));

答案 1 :(得分:2)

parameter.Size设置为数据库的最大列大小,在我遇到此问题时纠正了我的问题。

For Each parameter As SqlClient.SqlParameter In command.Parameters
   parameter.Value = row.Item(parameter.SourceColumn)
   parameter.Size = Me.mData.Columns.Item(parameter.SourceColumn).MaxLength
Next

答案 2 :(得分:1)

您可以添加这样的参数:

command.Parameters.Add(@"v1", SqlDbType.VarChar).Value = TextBox1.Text;
command.Parameters.Add(@"v2", SqlDbType.Int).Value = 0;
command.Parameters.Add(@"v3", SqlDbType.Int).Value = 0;
command.Parameters.Add(@"v4", SqlDbType.VarBinary).Value = FileUpload1.FileBytes;
command.Parameters.Add(@"v5", SqlDbType.VarChar).Value = TextBox3.Text;
command.Parameters.Add(@"v6", SqlDbType.VarChar).Value = TextBox4.Text;
command.Parameters.Add(@"v7", SqlDbType.VarChar).Value = TextBox5.Text;


command.ExecuteNonQuery();

conn.Close();

但我个人更喜欢像这样添加我的参数:

cmd.Parameters.AddWithValue(@"v1",  TextBox1.Text);
cmd.Parameters.AddWithValue(@"v2", 0);
cmd.Parameters.AddWithValue(@"v3", 0);
cmd.Parameters.AddWithValue(@"v4", FileUpload1.FileBytes);
cmd.Parameters.AddWithValue(@"v5", TextBox3.Text);
cmd.Parameters.AddWithValue(@"v6", TextBox4.Text);
cmd.Parameters.AddWithValue(@"v7", TextBox5.Text);

答案 3 :(得分:0)

SqlCommand.Prepare() requires all variable parameters tobe non zero .

请检查是否有任何值为空。检查是否为空:

command.Parameters[0].Value = (!String.IsNullOrEmpty(TextBox1.Text.ToString()))?TextBox1.Text.ToString():"Empty";
command.Parameters[1].Value = 0;
command.Parameters[2].Value = 0;
command.Parameters[3].Value = FileUpload1.FileBytes;
command.Parameters[4].Value =  (!String.IsNullOrEmpty(TextBox3.Text.ToString()))?TextBox3.Text.ToString():"Empty";
command.Parameters[5].Value = (!String.IsNullOrEmpty(TextBox4.Text.ToString()))?TextBox4.Text.ToString():"Empty";
command.Parameters[6].Value =  (!String.IsNullOrEmpty(TextBox5.Text.ToString()))?TextBox5.Text.ToString():"Empty";