【问题标题】:Trying to use a SQL stored procedure in Windows Forms尝试在 Windows 窗体中使用 SQL 存储过程
【发布时间】:2016-06-09 17:57:57
【问题描述】:

以下代码导致我的 Windows 窗体应用出现问题:

SqlConnection cnnDB = new SqlConnection(<connection string>);
try
{
    SqlCommand cmd = cnnDB.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "sp_ProcName";
    cmd.Parameters.AddWithValue("@int1", ComboBox1.SelectedValue);
    cmd.Parameters.AddWithValue("@int2", ComboBox2.SelectedValue);
    cmd.Parameters.AddWithValue("@int3", ComboBox3.SelectedValue);
    cmd.Parameters.AddWithValue("@int4", ComboBox4.SelectedValue);
    cmd.Parameters.AddWithValue("@varchar1", TextBox1.Text);
    cmd.Parameters.AddWithValue("@varchar2", TextBox2.Text);
    cmd.Parameters.AddWithValue("@varchar3", ComboBox5.SelectedValue);
    cmd.Parameters.AddWithValue("@varchar4", stringVariable);
    cnnDB.Open();
    cmd.ExecuteNonQuery();
    cnnDB.Close();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

这就是我执行它时发生的情况:

  1. 如果stringVariable 是“插入”或“更新”,则来自 TextBox1 和 TextBox2 的数据不会传递给过程。
  2. 如果 stringVariable 是“删除”,我会收到错误消息“过程或函数‘sp_ProcName’需要参数‘@varchar3’,但未提供”。

代码有问题吗?

编辑:根据@Steve 和@MethodMan 的要求,下面是SQL Server 中的存储过程。

ALTER PROCEDURE [dbo].[sp_ProcName]
(
      @int1 int,
      @int2 int,
      @int3 int,
      @int4 int,
      @varchar1 varchar(7),
      @varchar2 varchar(6),
      @varchar3 nvarchar(10),
      @varchar4 nvarchar(10) = ''
)
AS
BEGIN
     SET NOCOUNT ON;
     IF @varchar4 = 'Insert'
     BEGIN
          INSERT INTO Table1(int1,int2,int3,int4,varchar1,varchar2,varchar3)
          VALUES(@int1,@int2,@int3,@int4,@varchar1,@varchar2,@varchar3)
     END
     IF @varchar4 = 'Update'
     BEGIN
          UPDATE Table1
               SET int1=@int1, int2=@int2, int3=@int3, int4=@int4, varchar1=@varchar1, varchar2=@varchar2, varchar3=@varchar3
          WHERE varchar1 = @varchar1
     END
     IF @varchar4 = 'Delete'
     BEGIN
          DELETE FROM Table1
          WHERE varchar1 = @varchar1
     END

好吧,经过仔细检查,我发现存储过程中的更新部分是“坏蛋”。我需要找到其他方法。也删除部分。

附:抱歉,问题太长了。

【问题讨论】:

  • 我认为您应该显示 StoredProcedure 的代码以更好地了解您的问题
  • 您的 ComboBox 是否设置了 DataSource 和 ValueMember? AddWithValue 不适用于“对象”,这是 SelectedValue 试图返回的。
  • 为了让任何人都能正确回答这个问题,您需要显示完整的存储过程,并且错误会告诉您确切的问题是什么。如果您声明参数,那么如果不采纳发布答案的建议并使用Default Values,则必须传入所有参数
  • @LarsTech,是的,所有的 ComboBox 都设置了 DataSource 和 ValueMember,并且在插入和删除的情况下可以进行数据操作
  • @MethodMan 好吧,这就是问题所在。出于某种原因,ComboBox5 没有传递任何内容,即使我从下拉列表中选择它也是如此。

标签: c# winforms stored-procedures


【解决方案1】:

您需要使用DBNull.Value 而不是null 或为您可能丢失的存储过程参数分配默认值

方法一:

CREATE PROCEDURE [dbo].[problemParam] 
    // Other parameters go here then
    @varchar1 NVARCHAR(50) = null, 
    @varchar1 NVARCHAR(50) = null,
    @varchar1 NVARCHAR(50) = null, 
AS  
BEGIN
  -- Procedure Logic go here
END

方法二:

object param1 = DBNull.Value;
object param2 = DBNull.Value;
object param3 = DBNull.Value;

if(!String.IsNullOrEmpty(TextBox1.Text))
    param1 = TextBox1.Text;

if(!String.IsNullOrEmpty(TextBox2.Text))
    param2 = TextBox2.Text;

if(ComboBox5.SelectedValue != null)
    param3 = TextBox1.Text;

cmd.Parameters.AddWithValue("@varchar1", param1 );
cmd.Parameters.AddWithValue("@varchar2", param2 );
cmd.Parameters.AddWithValue("@varchar3", param3 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2018-05-12
    • 1970-01-01
    • 2014-04-11
    • 2012-02-21
    相关资源
    最近更新 更多