Sql server 在ADO.Net中不使用存储过程获取输出值

Sql server 在ADO.Net中不使用存储过程获取输出值,sql-server,vb.net,ado.net,adodb,Sql Server,Vb.net,Ado.net,Adodb,我正在将ADODB应用程序转换为ADO.Net,其中包含一个命令,用于插入新行并返回如下自动增量值:- INSERT INTO [MyDB].[dbo].[MyTable] (COLUMN1, COLUMN2) OUTPUT inserted.ID_PRIMARY VALUES ('This', 'That') command_string = (as above) Dim insert_command As SqlCommand = N

我正在将ADODB应用程序转换为ADO.Net,其中包含一个命令,用于插入新行并返回如下自动增量值:-

INSERT INTO [MyDB].[dbo].[MyTable] (COLUMN1, COLUMN2) OUTPUT inserted.ID_PRIMARY
                      VALUES ('This', 'That')
command_string = (as above)
Dim insert_command   As SqlCommand     = New SqlCommand(command_string, database_connection)
Dim output_parameter As SqlParameter   = New SqlParameter("@inserted.ID_PRIMARY", SqlDbType.Int)
Dim transaction      As SqlTransaction = database_connection.BeginTransaction(System.Data.IsolationLevel.Serializable)
insert_command.Transaction = transaction
output_parameter.Direction = ParameterDirection.Output
insert_command.Parameters.Add(output_parameter)
insert_command.ExecuteNonQuery()
transaction.Commit
Dim output_parameter As SqlParameter = New SqlParameter("@ID_PRIMARY", SqlDbType.Int)
你可以抓住输出值,然后离开。但当我尝试使用ADO.Net时,如下所示:-

INSERT INTO [MyDB].[dbo].[MyTable] (COLUMN1, COLUMN2) OUTPUT inserted.ID_PRIMARY
                      VALUES ('This', 'That')
command_string = (as above)
Dim insert_command   As SqlCommand     = New SqlCommand(command_string, database_connection)
Dim output_parameter As SqlParameter   = New SqlParameter("@inserted.ID_PRIMARY", SqlDbType.Int)
Dim transaction      As SqlTransaction = database_connection.BeginTransaction(System.Data.IsolationLevel.Serializable)
insert_command.Transaction = transaction
output_parameter.Direction = ParameterDirection.Output
insert_command.Parameters.Add(output_parameter)
insert_command.ExecuteNonQuery()
transaction.Commit
Dim output_parameter As SqlParameter = New SqlParameter("@ID_PRIMARY", SqlDbType.Int)
返回一个错误:-

SqlException(0x80131904)“.”附近的语法不正确


我很感激我可以使用存储过程来执行插入和检索返回值,如前所述,但我想知道是否有任何方法可以在没有存储过程的情况下实现这一点?还是我忽略了一些小错误?

从插入的
输出中新插入的
ID
。ID\u PRIMARY
将是从语句返回的数据集。您需要使用
ExecuteReader
方法读取返回的值:

' setup as above - except you don't need the "output_parameter"
Dim reader As SqlDataReader = insert_command.ExecuteReader()

While reader.Read()
    ' get your newly inserted ID's here as returned dataset
    Dim newlyInsertedID As Integer = reader.GetInt32(0)

    ' if you insert multiple rows at once, you might need store those ID's 
    ' that you fetch back one by one into a list or something
End While

从插入的
输出中新插入的
ID
。ID\u PRIMARY
将是从语句返回的数据集。您需要使用
ExecuteReader
方法读取返回的值:

' setup as above - except you don't need the "output_parameter"
Dim reader As SqlDataReader = insert_command.ExecuteReader()

While reader.Read()
    ' get your newly inserted ID's here as returned dataset
    Dim newlyInsertedID As Integer = reader.GetInt32(0)

    ' if you insert multiple rows at once, you might need store those ID's 
    ' that you fetch back one by one into a list or something
End While

您可以利用SQL Server在一个批处理中发出两个SQL命令这一事实。并使用T-SQL函数查找添加到当前作用域的最新标识值

Dim sqlText = "INSERT INTO [MyDB].[dbo].[MyTable] (COLUMN1, COLUMN2) " & _
              "VALUES ('This', 'That'); SELECT SCOPE_IDENTITY()"
Dim insert_command = New SqlCommand(sqlText, database_connection)
insert_command.Transaction = transaction
Dim result = Convert.ToInt32(insert_command.ExecuteScalar())
transaction.Commit
否则,如果要使用语法,请删除输出参数

Dim sqlText = "INSERT INTO [MyDB].[dbo].[MyTable] (COLUMN1, COLUMN2) " & _ 
              "OUTPUT inserted.ID_PRIMARY  VALUES ('This', 'That')"
Dim insert_command  = New SqlCommand(sqlText, database_connection)
insert_command.Transaction = transaction
Dim result = Convert.ToInt32(insert_command.ExecuteScalar())
transaction.Commit

但与前面一样,使用ExecuteScalar检索查询返回的第一行/第一列的值

您可以利用这样一个事实,即使用SQL Server可以在一个批处理中发出两个SQL命令。并使用T-SQL函数查找添加到当前作用域的最新标识值

Dim sqlText = "INSERT INTO [MyDB].[dbo].[MyTable] (COLUMN1, COLUMN2) " & _
              "VALUES ('This', 'That'); SELECT SCOPE_IDENTITY()"
Dim insert_command = New SqlCommand(sqlText, database_connection)
insert_command.Transaction = transaction
Dim result = Convert.ToInt32(insert_command.ExecuteScalar())
transaction.Commit
否则,如果要使用语法,请删除输出参数

Dim sqlText = "INSERT INTO [MyDB].[dbo].[MyTable] (COLUMN1, COLUMN2) " & _ 
              "OUTPUT inserted.ID_PRIMARY  VALUES ('This', 'That')"
Dim insert_command  = New SqlCommand(sqlText, database_connection)
insert_command.Transaction = transaction
Dim result = Convert.ToInt32(insert_command.ExecuteScalar())
transaction.Commit

但与前面一样,使用ExecuteScalar检索查询返回的第一行/第一列的值

通过将SQL更改为:-

INSERT INTO [MyDB].[dbo].[MyTable] (COLUMN1, COLUMN2)
    OUTPUT inserted.ID_PRIMARY As ID_PRIMARY
        VALUES ('This', 'That')
并设置如下参数:-

INSERT INTO [MyDB].[dbo].[MyTable] (COLUMN1, COLUMN2) OUTPUT inserted.ID_PRIMARY
                      VALUES ('This', 'That')
command_string = (as above)
Dim insert_command   As SqlCommand     = New SqlCommand(command_string, database_connection)
Dim output_parameter As SqlParameter   = New SqlParameter("@inserted.ID_PRIMARY", SqlDbType.Int)
Dim transaction      As SqlTransaction = database_connection.BeginTransaction(System.Data.IsolationLevel.Serializable)
insert_command.Transaction = transaction
output_parameter.Direction = ParameterDirection.Output
insert_command.Parameters.Add(output_parameter)
insert_command.ExecuteNonQuery()
transaction.Commit
Dim output_parameter As SqlParameter = New SqlParameter("@ID_PRIMARY", SqlDbType.Int)

语法错误已通过将SQL更改为:-

INSERT INTO [MyDB].[dbo].[MyTable] (COLUMN1, COLUMN2)
    OUTPUT inserted.ID_PRIMARY As ID_PRIMARY
        VALUES ('This', 'That')
并设置如下参数:-

INSERT INTO [MyDB].[dbo].[MyTable] (COLUMN1, COLUMN2) OUTPUT inserted.ID_PRIMARY
                      VALUES ('This', 'That')
command_string = (as above)
Dim insert_command   As SqlCommand     = New SqlCommand(command_string, database_connection)
Dim output_parameter As SqlParameter   = New SqlParameter("@inserted.ID_PRIMARY", SqlDbType.Int)
Dim transaction      As SqlTransaction = database_connection.BeginTransaction(System.Data.IsolationLevel.Serializable)
insert_command.Transaction = transaction
output_parameter.Direction = ParameterDirection.Output
insert_command.Parameters.Add(output_parameter)
insert_command.ExecuteNonQuery()
transaction.Commit
Dim output_parameter As SqlParameter = New SqlParameter("@ID_PRIMARY", SqlDbType.Int)

请尝试以下代码:

/****** Object:  Table [dbo].[Pedidos]    Script Date: 03/01/2015 16:48:17 ******/
SET ANSI_NULLS ON
GO


SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Pedidos](
[PedidoID] [int] IDENTITY(1,1) NOT NULL,
[Data] [date] NOT NULL,
[clienteID] [int] NOT NULL,
 CONSTRAINT [PK_Pedidos] PRIMARY KEY CLUSTERED 
(
[PedidoID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY =     OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Pedidos]  WITH CHECK ADD  CONSTRAINT     [FK_Pedidos_Clientes] FOREIGN KEY([clienteID])
REFERENCES [dbo].[Clientes] ([clienteID])
GO

ALTER TABLE [dbo].[Pedidos] CHECK CONSTRAINT [FK_Pedidos_Clientes]
GO
使用Dim标识作为整数或声明公共 返回插入记录自动递增字段值的标识
PedidoID

    Dim connection As SqlConnection = databaseDB.GetConnection
    Dim insertStatement As String _
        = "INSERT [dbo].[Pedidos] " _
        & "([Data], [clienteID]) " _
        & "VALUES (@Data, @clienteID) SELECT @PedidoID = SCOPE_IDENTITY()" 'SELECT SCOPE_IDENTITY() AS 'Identity
    Dim insertCommand As New SqlCommand(insertStatement, connection)
    insertCommand.CommandType = CommandType.Text
    insertCommand.Parameters.AddWithValue("@Data", dbo_pedidos.Data)
    insertCommand.Parameters.AddWithValue("@clienteID", dbo_pedidos.clienteID)
    ' Inclui o SqlParameter para retornar o novo valor identity
    ' Define o ParameterDirection como Output.(Saida)
    insertCommand.Parameters.Add("@PedidoID", SqlDbType.Int, 0, "PedidoID")
    insertCommand.Parameters("@PedidoID").Direction = ParameterDirection.Output

    Try
        connection.Open()
        Dim count As Integer = insertCommand.ExecuteNonQuery()
        If count > 0 Then
            Identity = insertCommand.Parameters("@PedidoID").Value
            Return True
        Else
            Return False
        End If
    Catch ex As SqlException
        Throw ex
    Finally
        connection.Close()
    End Try

请尝试以下代码:

/****** Object:  Table [dbo].[Pedidos]    Script Date: 03/01/2015 16:48:17 ******/
SET ANSI_NULLS ON
GO


SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Pedidos](
[PedidoID] [int] IDENTITY(1,1) NOT NULL,
[Data] [date] NOT NULL,
[clienteID] [int] NOT NULL,
 CONSTRAINT [PK_Pedidos] PRIMARY KEY CLUSTERED 
(
[PedidoID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY =     OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Pedidos]  WITH CHECK ADD  CONSTRAINT     [FK_Pedidos_Clientes] FOREIGN KEY([clienteID])
REFERENCES [dbo].[Clientes] ([clienteID])
GO

ALTER TABLE [dbo].[Pedidos] CHECK CONSTRAINT [FK_Pedidos_Clientes]
GO
使用Dim标识作为整数或声明公共 返回插入记录自动递增字段值的标识
PedidoID

    Dim connection As SqlConnection = databaseDB.GetConnection
    Dim insertStatement As String _
        = "INSERT [dbo].[Pedidos] " _
        & "([Data], [clienteID]) " _
        & "VALUES (@Data, @clienteID) SELECT @PedidoID = SCOPE_IDENTITY()" 'SELECT SCOPE_IDENTITY() AS 'Identity
    Dim insertCommand As New SqlCommand(insertStatement, connection)
    insertCommand.CommandType = CommandType.Text
    insertCommand.Parameters.AddWithValue("@Data", dbo_pedidos.Data)
    insertCommand.Parameters.AddWithValue("@clienteID", dbo_pedidos.clienteID)
    ' Inclui o SqlParameter para retornar o novo valor identity
    ' Define o ParameterDirection como Output.(Saida)
    insertCommand.Parameters.Add("@PedidoID", SqlDbType.Int, 0, "PedidoID")
    insertCommand.Parameters("@PedidoID").Direction = ParameterDirection.Output

    Try
        connection.Open()
        Dim count As Integer = insertCommand.ExecuteNonQuery()
        If count > 0 Then
            Identity = insertCommand.Parameters("@PedidoID").Value
            Return True
        Else
            Return False
        End If
    Catch ex As SqlException
        Throw ex
    Finally
        connection.Close()
    End Try

谢谢你的帮助;我已经添加了数据读取器,但是SQL语句中仍然存在语法错误;你知道在这里做什么吗?@BrianHooper:你发布的SQL看起来很好-不确定。。。到底是什么错误?它指向哪里?您是否将VB.NET中的SQL连接在一起?也许你在某处遗漏了一个空间或类似的东西。。。。或者您正在运行SQL Server 2000(或“80级”兼容模式下的数据库)??
OUTPUT
子句是SQL Server 2005中的一项新功能…感谢您的帮助;我已经添加了数据读取器,但是SQL语句中仍然存在语法错误;你知道在这里做什么吗?@BrianHooper:你发布的SQL看起来很好-不确定。。。到底是什么错误?它指向哪里?您是否将VB.NET中的SQL连接在一起?也许你在某处遗漏了一个空间或类似的东西。。。。或者您正在运行SQL Server 2000(或“80级”兼容模式下的数据库)??
OUTPUT
子句是SQLServer2005中的一项新功能。。。