使用自动递增ID插入
本文关键字:ID 插入 | 更新日期: 2023-09-27 18:20:32
我正在使用存储过程插入数据库,并得到错误:
Procedure or function 'sp_Addrecord' expects parameter '@RecordNumber', which was not supplied.
RecordNumber是一个自动递增的ID,所以我知道ID必须从插入命令中省略它,并指定必须插入的列和位置以避免这种情况,但我正在调用由另一个类处理的过程,所以我在哪里可以指定它,就像你通常说的那样:
SqlCommand cmd = new SqlCommand("INSERT INTO CARS (carDate, carTime) Values (@Date, @Time)", conDatabase);
这是我的代码,为了简化这个例子,我避免了使用语句:
List<CarRecord> carRecords;
private void Save_Record_Click(object sender, RoutedEventArgs e)
{
SqlConnection conDatabase = new SqlConnection(String.Format(@"Data Source={0};Initial Catalog={1};Persist Security Info=True;User ID={2};Password={3}", SQLFunctions.connectSQL.SQLSERVER_ID, SQLFunctions.connectSQL.SQLDatabaseName, SQLFunctions.connectSQL.SQLServerLoginName, SQLFunctions.connectSQL.SQLServerPassword));
conDatabase.Open();
SqlCommand cmd = new SqlCommand("sp_Addrecord", conDatabase);
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
conDatabase.Close();
}
public bool Addrecord(CarRecord DataRecord)
{
return ExecuteNonQuery("sp_Addrecord", null,
CreateParameter("@Date", SqlDbType.NVarChar, DataRecord.carDate),
CreateParameter("@Time", SqlDbType.NVarChar, DataRecord.carTime),
);
}
EDIT-存储过程:
USE [SDC Logging]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_Addrecord]
@RecordNumber int,
@Date nvarchar(50),
@Time nvarchar(50),
AS
BEGIN
SET NOCOUNT ON;
WITH [source](RecordNumber, Date, Time)
AS
(
SELECT @RecordNumber, @Date, @Time,
)
MERGE dbo.Bags AS [target] USING [source]
ON [target].Date = [source].Date
WHEN MATCHED THEN UPDATE SET
[target].Date = @Date,
[target].Time = @Time,
WHEN NOT MATCHED THEN
INSERT ( Date, Time, )
VALUES( @Date, @Time, );
SELECT SCOPE_IDENTITY()
END
这个错误说明了一切。您的sp_Addrecord
指定了一个您正在提供的参数。基本上,您在此处指定的参数。。。
return ExecuteNonQuery("sp_Addrecord", null,
CreateParameter("@Date", SqlDbType.NVarChar, DataRecord.carDate),
CreateParameter("@Time", SqlDbType.NVarChar, DataRecord.carTime),
);
必须与sp_Addrecord
存储过程定义的参数的名称和数据类型相匹配。此外,请确保存储过程的查询与此查询匹配。。。
INSERT INTO CARS (carDate, carTime) Values (@Date, @Time)
根据您的编辑进行编辑
您需要在此处指定@RecordNumber
参数。。。
return ExecuteNonQuery("sp_Addrecord", null,
CreateParameter("@RecordNumber", SqlDbType.Int, DataRecord.recordNumber),
CreateParameter("@Date", SqlDbType.NVarChar, DataRecord.carDate),
CreateParameter("@Time", SqlDbType.NVarChar, DataRecord.carTime),
);
不要担心insert
,只需确保在插入时传递一个"无效记录号",如-1
,如果MERGE
语句找不到id为-1的记录,它将在您的标识列的帮助下成功插入具有自动生成id的记录
试试这个。
您不需要调用单独的方法Addrecord。
但是,您仍然希望使用单独的方法。在AddRecord
方法中添加以下代码并删除现有代码:
SqlParameter []parms = new SqlParameter[1];
parms[0] = new SqlParameter("@Date",DataRecord.carDate) ;
parms[1] = new SqlParameter("@Time",DataRecord.carTime) ;
cmd.Parameters.AddRange(parms);
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
conDatabase.Close();