首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >要插入相关表的存储过程

要插入相关表的存储过程
EN

Stack Overflow用户
提问于 2014-04-13 22:13:22
回答 1查看 488关注 0票数 0

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

“无法将值NULL插入'marka_id‘列、表'env.dbo.Marka';列不允许空值。插入失败。 无法将值NULL插入列'model_id',表'env.dbo.Model';列不允许空。插入失败。 无法将值NULL插入'f_id‘列,表'env.dbo.Firma';列不允许空值。插入失败。 无法将值NULL插入'sira_no‘列,表'env.dbo.Ana';列不允许空。插入失败。 声明已被终止。 声明已被终止。 声明已被终止。 声明已被终止。“

以下是存储过程:

代码语言:javascript
复制
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#打来:

代码语言:javascript
复制
    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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-13 22:28:02

错误告诉您,当您调用insert时,您没有传入非空列的值。具体来说,如果您的ID列被设置为您的主键,则它们不能为空。

如果不查看表,很难判断,但我认为您需要将列设置为标识,以便自动创建用于您的行的ID。否则,如果在插入时不指定ID,则会收到正在接收的错误。

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

这里有一个很好的堆叠溢出问题,可以用来启动种子。它适用于sql 2005,但其进程相同:

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

编辑以回答您的问题:

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

代码语言:javascript
复制
SELECT TOP 1  @marka_id =  marka_id FROM Marka WHERE marka_adi = @marka_adi

对于所有的susbequent语句,您也必须这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23049079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档