Làm thế nào để vượt qua bảng tham số có giá trị để lưu trữ thủ tục bằng cách sử dụng ADO.Net?Vượt qua bảng tham số có giá trị bằng cách sử dụng ADO.Net
Trả lời
Tạo gõ vào SQL Server:
CREATE TYPE [dbo].[MyDataType] As Table ( ID INT, Name NVARCHAR(50) )
Tạo Thủ tục:
CREATE PROCEDURE [dbo].[MyProcedure] ( @myData As [dbo].[MyDataType] Readonly ) AS BEGIN SELECT * FROM @myData END
Tạo DataTable trong C#:
DataTable myDataTable = new DataTable("MyDataType"); myDataTable.Columns.Add("Name", typeof(string)); myDataTable.Columns.Add("Id", typeof(Int32)); myDataTable.Rows.Add("XYZ", 1); myDataTable.Rows.Add("ABC", 2);
Tạo SQL Parameter:
SqlParameter parameter = new SqlParameter(); parameter.ParameterName = "@myData"; parameter.SqlDbType = System.Data.SqlDbType.Structured; parameter.Value = myDataTable; command.Parameters.Add(parameter);
Câu hỏi này trùng lặp với How to pass table value parameters to stored procedure from .net code. Vui lòng xem câu hỏi đó để biết ví dụ minh họa việc sử dụng số DataTable
hoặc IEnumerable<SqlDataRecord>
.
Tôi cố gắng này và nhận được ngoại lệ:
Bảng tham số kiểu '@MyDataType' phải có một tên kiểu hợp lệ.
tôi đã phải đặt "TypeName" tài sản của SqlParameter:
parameter.TypeName = "MyDataType";
có. bạn nói đúng, "TypeName" phải được thiết lập. –
Thêm lược đồ db như là một phần của tên bảng đã làm cho tôi: DataTable myDataTable = new DataTable ("dbo.MyDataType"); – noontz
Bạn có thể thêm tiền tố với Exec
using(SqlConnection con = new SqlConnection("Server=.;database=employee;user=sa;password=12345"))
{
SqlCommand cmd = new SqlCommand(" exec ('drop table '[email protected])" , con);
cmd.Parameters.AddWithValue("@tab" ,"Employee");
con.Open();
cmd.ExecuteNonQuery();
}
này chỉ áp dụng trong SQL Server 2008 –
Cùng đang làm việc tốt với SQL Server 2012. –
Tôi có nghĩa là điều này chỉ có sẵn máy chủ Sql 2008 trở lên và do đó, nó cũng sẽ hoạt động trong năm 2012. –