使用自动递增ID插入

时间:2014-09-04 07:31:21

标签: c# sql-server-2008 stored-procedures

我使用存储过程插入数据库,我收到错误:

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);

这是我的代码,为了简单起见,我避免使用using语句:

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),
        );
    }

编辑 - 存储过程:

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

2 个答案:

答案 0 :(得分:1)

错误说明了一切。您的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只是确保在插入时传递了一个&#34;无效的记录号&#34;例如-1,如果MERGE语句没有找到id为-1的记录,它将在您的标识列的帮助下成功插入带有自动生成的Id的记录

答案 1 :(得分:0)

试试这个。

您不需要调用单独的方法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();