2012-02-15 40 views
13

Tôi gặp sự cố khi gửi câu lệnh SQL thông qua DbContext sử dụng context.Database.ExecuteSqlCommand().SqlException: Cú pháp Lỗi Gần 'GO'

Tôi cố gắng để thực hiện

CREATE TABLE Phones([Id] [uniqueidentifier] NOT NULL PRIMARY KEY, 
    [Number] [int],[PhoneTypeId] [int]) 
GO 
ALTER TABLE [dbo].[Phones] ADD CONSTRAINT [DF_Phones_Id] 
    DEFAULT (newid()) FOR [Id] 
GO 

này không thành công với chuỗi lỗi

Incorrect syntax near the keyword 'ALTER'. 
Incorrect syntax near 'GO'. 

Tuy nhiên chạy rằng tuyên bố chính xác trong SSMS chạy mà không có lỗi? Bất kỳ vấn đề nào tôi cần phải giải quyết liên quan đến ràng buộc mặc định thông qua DbContext. Tôi đã thấy vấn đề với những người sử dụng các ràng buộc và không có IsDbGenerated được đặt thành true. Tôi không chắc chắn như thế nào mà sẽ áp dụng ở đây mặc dù.

Trả lời

27

GO không phải là một phần của SQL, do đó, nó không thể được thực thi với ExecuteSqlCommand(). Hãy nghĩ về GO như một cách để tách các lô khi sử dụng Management Studio hoặc các công cụ dòng lệnh. Thay vào đó, chỉ cần loại bỏ các câu lệnh GO và bạn sẽ ổn thôi. Nếu bạn gặp lỗi vì bạn cần chạy các lệnh của bạn theo các lô riêng biệt, chỉ cần gọi ExecuteSqlCommand() một lần cho mỗi lô bạn muốn chạy.

4

Dave Markle đánh tôi với nó. Thực tế, bạn có thể thay đổi "GO" thành any other string để phân tách các lô.

Thực hiện thay thế ở đây là sử dụng SMO thay vì Khuôn khổ thực thể. Có một phương pháp hữu ích có tên là ExecuteNonQuery mà tôi nghĩ sẽ làm cho cuộc sống của bạn đơn giản hơn rất nhiều. Here là một ví dụ triển khai tốt.

+0

Đó là đúng đối với SSMS, tuy nhiên ngay cả khi bạn thay đổi dấu tách hàng loạt trong SSMS, mã ở trên sẽ vẫn bị nghẹt thở trên 'GO'. –

+0

Một lưu ý mà tôi muốn thêm. Nếu như tôi, bạn thường muốn một số loại giá trị trả về từ các truy vấn của bạn mà bạn đang chuyển qua SMO, hãy lưu ý rằng ExecuteWithResults sẽ trả về các ngoại lệ khi nó chạy vào câu lệnh GO và ALTER. Tôi đã tìm ra điều này một chút trước đây, và cuối cùng chỉ cần đặt một tùy chọn để ExecuteNonQuery trên giao diện người dùng của chúng tôi được kiểm tra tại thời gian chạy tập lệnh. – CodeWarrior

0

Tôi biết, necroposting là maner xấu, nhưng có thể bài đăng này sẽ tiết kiệm thời gian của ai đó. Vì nó đã được đề cập trong bài viết của Dave, GO không phải là một phần của SQL, vì vậy chúng tôi có thể tạo ra ít workaround để làm cho nó hoạt

  var text = System.IO.File.ReadAllText("initialization.sql"); 
      var parts = text.Split(new string[] { "GO" }, System.StringSplitOptions.None); 
      foreach (var part in parts) { context.Database.ExecuteSqlCommand(part); } 

      context.SaveChanges(); 

Trong trường hợp này các lệnh của bạn sẽ được tách ra và thực hiện mà không vấn đề

Các vấn đề liên quan