使用自动递增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

使用自动递增ID插入

这个错误说明了一切。您的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();