Tôi có một ứng dụng C# để gọi các thủ tục lưu trữ SQL Server khác nhau để thực hiện nhiều công việc xuất và nhập dữ liệu vào SQL Server Cơ sở dữ liệu 2008 R2.Làm thế nào để chuỗi nhiều câu lệnh T-SQL (cách nhau bởi GO) thành một cuộc gọi tới SQL bằng cách sử dụng SqlCommand
Tất cả đều ổn, không sao cả. Và ứng dụng của tôi gọi chúng là tốt với tất cả các thông số, v.v.
Để "hỗ trợ người dùng", tôi đang mã hóa nút để thêm tất cả các thủ tục đã lưu vào cơ sở dữ liệu được cấu hình. Để kết thúc này, tôi đã tạo một tập lệnh dọc theo các dòng:
USE [%DATABASENAME%]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spMyProc1]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[spMyProc1]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spMyProc2]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[spMyProc2]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spMyProc3]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[spMyProc3]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[spMyProc1]
@VariousParams varchar(100),
@ResultText varchar(4000) OUTPUT
AS
BEGIN
-- Code removed for brevity
END
GO
--
CREATE PROCEDURE [dbo].[spMyProc2]
@VariousParams varchar(100),
@ResultText varchar(4000) OUTPUT
AS
BEGIN
-- Code removed for brevity
END
GO
--
CREATE PROCEDURE [dbo].[spMyProc3]
@VariousParams varchar(100),
@ResultText varchar(4000) OUTPUT
AS
BEGIN
-- Code removed for brevity
END
GO
Khi tôi chạy nó trong SQL Server Management Studio, nó chạy tốt, không có vấn đề gì cả.
Tuy nhiên trong C# ứng dụng của tôi, một ngoại lệ được ném và tôi nhận được một tàu tải trọng của lỗi như sau:
cú pháp sai gần 'GO'.
Cú pháp không chính xác gần 'GO'.
Cú pháp không chính xác gần 'GO'.
Cú pháp không chính xác gần 'GO'.
Cú pháp không chính xác gần 'GO'.
Cú pháp không chính xác gần 'GO'.
'TẠO/THAY THẾ THỦ TỤC' phải là câu lệnh đầu tiên trong chuỗi truy vấn.
Không thể sử dụng câu lệnh RETURN với giá trị trả lại trong ngữ cảnh này.
Không thể sử dụng câu lệnh RETURN với giá trị trả lại trong ngữ cảnh này.
Cú pháp không chính xác gần 'GO'.
Phải khai báo biến vô hướng "@MessageText".
Phải khai báo biến vô hướng "@ListOfIDsToImport".
Phải khai báo biến vô hướng "@SourceDataFolder".
Phải khai báo biến vô hướng "@SourceDataFolder".
Phải khai báo biến vô hướng "@SequenceNo".
Phải khai báo biến vô hướng "@UserID".
Phải khai báo biến vô hướng "@SequenceNo".
Phải khai báo biến vô hướng "@UserID".
Phải khai báo biến vô hướng "@ListOfIDsToImport".
Phải khai báo biến vô hướng "@ListOfIDsToImport".
Phải khai báo biến vô hướng "@ListOfIDsToImport".
Phải khai báo biến vô hướng "@MessageText".
Phải khai báo biến vô hướng "@MessageText".
Phải khai báo biến vô hướng "@MessageText".
Cú pháp không chính xác gần 'GO'.
Tên biến '@PS_DEFAULT' đã được khai báo. Tên biến phải là duy nhất trong chuỗi truy vấn hoặc thủ tục được lưu trữ.
Tên biến '@PS_ERROR_MSG' đã được khai báo. Tên biến phải là duy nhất trong chuỗi truy vấn hoặc thủ tục được lưu trữ.
Tên biến '@PS_ERROR_SEVERITY' đã được khai báo. Tên biến phải là duy nhất trong chuỗi truy vấn hoặc thủ tục được lưu trữ.
Phải khai báo biến vô hướng "@SequenceNo".
Cú pháp không chính xác gần 'GO'.
(Đây là những gì trong ex.Message như bị chặn bởi khối catch trong mã bên dưới).
Mã của tôi rất đơn giản như sau:
bool retVal = false;
string command = Properties.Resources.MyApp_StoredProcedures.ToString().Replace("%DATABASENAME%", Properties.Settings.Default.DBName);
try
{
sqlCmd = new SqlCommand(command, csSQLConnection._conn);
sqlCmd.ExecuteNonQuery();
retVal = true;
}
catch (Exception ex)
{
retVal = false;
}
finally
{
sqlCmd.Dispose();
}
(Các thay thế ở trên chỉ đơn giản là thay thế placeholder trong dòng SỬ DỤNG ở phía trên cùng của kịch bản và nó hoạt động như tôi có thể nhìn thấy khi tôi bước qua và hơn dòng đó).
Vì vậy, về cơ bản, tôi đang làm gì sai vì bản thân SQL có vẻ ổn?
Rất cám ơn
bạn về cơ bản cần phải chia tay bạn tập lệnh ở mọi 'GO' và thực hiện từng" tập lệnh con "dưới dạng một cuộc gọi riêng biệt tới' SqlCommand.ExecuteNonQuery() ', để đáp ứng các yêu cầu như * 'TẠO/THAY THẾ' phải là câu lệnh đầu tiên trong một chuỗi truy vấn. * –