次のスクリプトは、Person
オブジェクトを作成し、それらの値を 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();
}
}
}
挿入する人が1人しかいない場合、これはうまく機能します。しかし、ユーザーが複数の 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 ループを試したのはそのためです)。SQLでテーブル変数を選択するには、おそらくDataTableを使用する必要があるようです。私はマークの近くにいますか?