【问题标题】:Stored Procedure to insert into related tables插入相关表的存储过程
【发布时间】:2014-05-27 18:18:31
【问题描述】:

我尝试编写一个 SP 来将值插入到相关表中。我收到错误消息:

“无法将值 NULL 插入列 'marka_id',表 'env.dbo.Marka';列不允许空值。INSERT 失败。

无法将值 NULL 插入列“model_id”、表“env.dbo.Model”;列不允许空值。插入失败。

无法将值 NULL 插入列“f_id”、表“env.dbo.Firma”;列不允许空值。插入失败。

无法将值 NULL 插入列“sira_no”、表“env.dbo.Ana”;列不允许空值。插入失败。

语句已终止。

语句已终止。

语句已终止。

语句已终止。"

这是存储过程:

use env
go
create procedure [SP$Ekle](
@marka_adi nvarchar(30) = NULL,
@model_adi nvarchar(30) = NULL,
@f_adi nvarchar(50) = NULL,
@adres nvarchar(20) = NULL,
@tel nvarchar(20) = NULL,
@seri_no nvarchar(30) = NULL,
@kullanici_adi nvarchar(50) = NULL,
@link nvarchar(50) = NULL,
@aciklama nvarchar(50) = NULL,
@sira_no int output
)
 as
 begin
 set nocount on

 DECLARE 
 @marka_id int,
 @model_id int,
 @f_id int
 begin

 INSERT INTO Marka(marka_adi) VALUES(@marka_adi);
 SET @marka_id = (SELECT marka_id FROM Marka WHERE marka_adi = @marka_adi);
 
 INSERT INTO Model(marka_id,model_adi) VALUES(@marka_id,@model_adi);
 SET @model_id = (SELECT @model_id FROM Model WHERE model_adi = @model_adi); 

 INSERT INTO Firma(f_adi,adres,tel) VALUES (@f_adi,@adres,@tel);
 SET @f_id = (SELECT f_id FROM Firma WHERE f_adi= @f_adi AND adres = @adres AND tel = @tel);
 
 INSERT INTO Ana(seri_no,kullanici_adi,link,aciklama,marka_id,model_id,f_id) VALUES (@seri_no,@kullanici_adi,@link,@aciklama,@marka_id,@model_id,@f_id);

 SELECT @sira_no = SCOPE_IDENTITY();
 end

 set nocount off
 end
 go 

从 C# 调用:

    cmd.CommandText = "SP$Ekle";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@marka_adi", TextBox1.Text));
        cmd.Parameters.Add(new SqlParameter("@model_adi", TextBox2.Text));
        cmd.Parameters.Add(new SqlParameter("@f_adi", TextBox3.Text));
        cmd.Parameters.Add(new SqlParameter("@adres", TextBox4.Text));
        cmd.Parameters.Add(new SqlParameter("@tel", TextBox5.Text));
        cmd.Parameters.Add(new SqlParameter("@seri_no", TextBox6.Text));
        cmd.Parameters.Add(new SqlParameter("@kullanici_adi", TextBox7.Text));
        cmd.Parameters.Add(new SqlParameter("@link", TextBox8.Text));
        cmd.Parameters.Add(new SqlParameter("@aciklama", TextBox9.Text));
        cmd.Parameters.Add(new SqlParameter("@sira_no", SqlDbType.Int)).Direction = ParameterDirection.Output;

    

【问题讨论】:

    标签: c# sql-server stored-procedures


    【解决方案1】:

    错误告诉您,当您调用insert 时,您没有为不可为空的列传递值。特别是您的 ID 列,如果它们被设置为您的主键,则它们不能为空。

    如果没有看到您的表格就很难判断,但我认为您需要将列设置为 Identity,以便自动为您创建行的 ID。否则,如果您没有在插入上指定 ID,您将收到您收到的错误。

    看看这个堆栈溢出问题: Setting Identity to on or off in SQL server

    这是关于开启播种的一个很好的 stackoverflow 问题。它适用于 sql 2005,但过程相同:

    Adding auto incrementing primary key to an existing table in SQL SERVER 2005

    编辑回答您的问题:

    您正在尝试将查询分配给您想要执行以下操作的变量:

    SELECT TOP 1  @marka_id =  marka_id FROM Marka WHERE marka_adi = @marka_adi
    

    您也必须为所有后续语句执行此操作。

    【讨论】:

    • 我将这些设置为身份。现在它给出了那个错误:子查询返回了超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多