以下脚本创建Person
对象并将这些值插入到a中
SQL Server数据库
$(document).ready(function ()
{
var person = {};
person.FirstName = "Bill";
person.LastName = "Wilson";
$('#button').click(function ()
{
var sender = JSON.stringify({ 'p': person });
$.ajax(
{
type: "POST",
url: "GetDrugQuiz.asmx/InsertPerson",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: sender,
success: function (data)
{
console.log(data.d);
},
error: function (xhr, ajaxOptions, thrownError)
{
console.log(xhr.status);
console.log(thrownError);
}
});
});
});
-
[WebMethod]
public void InsertPerson(Person p)
{
//var jss = new JavaScriptSerializer();
string cs = ConfigurationManager.ConnectionStrings["dbcs"].ConnectionString;
using (var con = new SqlConnection(cs))
{
using (var cmd = new SqlCommand("spInsertNames", con))
{
con.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@firstName",p.FirstName);
cmd.Parameters.AddWithValue("@lastName", p.LastName);
cmd.ExecuteNonQuery();
}
}
}
如果我只有一个人要插入,这可以正常工作。但是,假设用户有能力创建多个Person对象,我想一次性插入它们。这样做的最佳方法是什么?我试过了:
$(document).ready(function ()
{
var person = {};
person.FirstName = "Bill";
person.LastName = "Wilson";
personArray = new Array();
var person2 = {};
person2.FirstName = "Tim";
person2.LastName = "Thompson";
personArray.push(person);
personArray.push(person2);
var dto = { 'personList': personArray }
$('#button').click(function ()
{
//this is printing to the console correctly
console.log(dto);
$.ajax(
{
type: "POST",
url: "GetDrugQuiz.asmx/InsertPersonList",
dataType: "json",
data: JSON.stringify(dto),
success: function (data)
{
alert('success!');
alert(data.d);
},
error: function (xhr, ajaxOptions, thrownError)
{
alert(xhr.status);
alert(thrownError);
}
});
});
});
带
[WebMethod]
public void InsertPersonList(List<Person> personList)
{
string cs = ConfigurationManager.ConnectionStrings["dbcs"].ConnectionString;
//var jss = new JavaScriptSerializer();
//I know at some point the JSON will have to be deserialized
foreach (var person in personList)
{
using (var con = new SqlConnection(cs))
{
using (var cmd = new SqlCommand("spInsertNames",con))
{
con.Open();
cmd.Parameters.AddWithValue("@firstName", person.FirstName);
cmd.Parameters.AddWithValue("@lastName", person.LastName);
cmd.ExecuteNonQuery();
}
}
}
}
此操作失败,错误为System.InvalidOperationException: InsertPersonList Web Service method name is not valid.
at System.Web.Services.Protocols.HttpServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)
我知道,即使我尝试的东西是可能的,也不是一个好主意。我也知道,不知何故,我必须将JS数组反序列化为Person对象列表。最好的方法是什么?目前,我插入Names
表的存储过程是
create proc spInsertNames
@firstName varchar(50)
,@lastName varchar(50)
as
begin
insert into Names(FirstName, LastName)
values (@firstName,@lastName)
end
(这就是为什么我尝试使用foreach循环,因为值是使用行构造函数插入的)。看起来我应该使用DataTable来选择SQL中的表变量。我能接近这个标记吗?
答案 0 :(得分:2)
您可以使用DataTable将您的集合插入表值参数(与表变量不同)。
CREATE TYPE dbo.NameList AS TABLE
(
FirstName NVARCHAR(255),
LastName NVARCHAR(255)
);
然后你的程序:
CREATE PROCEDURE dbo.InsertNames_ByTVP
@Names AS dbo.NameList READONLY
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.Names(FirstName, LastName)
SELECT FirstName, LastName FROM @Names;
END
GO
您的C#代码只会传递DataTable:
SqlCommand cmd = new SqlCommand("dbo.InsertNames_ByTVP", connection_object);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter names = cmd.Parameters.AddWithValue("@Names", DataTableName);
names.SqlDbType = SqlDbType.Structured;
cmd.ExecuteNonQuery();