场景:只考虑我有一个包含3列Id,QuestionId和optedAnswer的表。我有一个表格,其中包含无问题和一些答案选项。在保存按钮上,我想将数据保存在数据库中(在我的表中)。
问题:我想在一个连接中保存所有答案。
我采取的步骤:我创建了一个结构为questionId的字符串:optedAnswwer | questionId:optedAnswer |等等.... 我写了一个程序。开始循环。基于':'和'|'拆分数据并在一个连接中保存数据。但这是一项严格的任务。有没有办法直接保存数据而不使用循环和拆分。
答案 0 :(得分:3)
将每个questionId及其OptedAnswer保存在Datatable中,然后将数据表插入SQL表,如下所示:
DataTable dataTable = null; // your data needs to be here
try
{
ConnectionStringSettings mConString = ConfigurationManager.ConnectionStrings["SiteSqlServer"];
// Optional truncating old table
using (SqlConnection connection = new SqlConnection(mConString.ConnectionString))
{
connection.Open();
// Delete old entries
SqlCommand truncate = new SqlCommand("TRUNCATE TABLE MYTABLE", connection);
truncate.ExecuteNonQuery();
}
SqlBulkCopy bulkCopy = new SqlBulkCopy(mConString.ConnectionString, SqlBulkCopyOptions.TableLock)
{
DestinationTableName = "dbo.MYTABLE",
BatchSize = 100, //set your required size
BulkCopyTimeout = 360
};
bulkCopy.WriteToServer(dataTable);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
答案 1 :(得分:1)
创建所有queastion和ans的XML字符串,并将这些xml字符串传递给sql并使用
sp_xml_preparedocument过程这些sql内置的proc读取XML。
您可以获得有关Bulk INsert
的更多信息答案 2 :(得分:0)
还有另一种方法可以在一个连接中保存多个数据。 创建一种类似这样的表
USE [CarWale] GO
CREATE TYPE [dbo]。[YourTypeName] AS TABLE(
[Col1] [bigint] NULL,
[Col2] [datetime] NULL,
[Col3] [bigint] NULL,
[Col4] [bigint] NULL,
[Col5] [datetime] NULL
) GO
然后编写一个这样的程序....
USE [CarWale] GO
SET ANSI_NULLS ON 走 SET QUOTED_IDENTIFIER ON GO
创建程序[dbo] .YOURPROCEDURENAME]
(@ yourDataTableName YourTypeName READONLY)
AS
BEGIN
INSERT INTO TableName
(Col1,
Col2,
Col3,
Col4,
Col5)
SELECT CP.Val1,
CP.Val2,
CP.Val3,
CP.Val4,
CP.Val15)
FROM @yourDataTableName CP END
然后在后面的代码中创建一个数据表,并将这个数据表传递给prosedure像这样...
SqlCommand cmd = new SqlCommand(“YOURPROCEDURENAME”);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(“@ yourDataTableName”,SqlDbType.Structured).Value = datatable;
cmd.Parameters [0] .TypeName =“YourTypeName”;
答案 3 :(得分:0)
我还会选择以xml为中心的解决方案,在xmldocument中准备数据,在数据库中发布,并使用xml中的SELECT作为插入源,例如:
declare @xml XML
DECLARE @docid int
set @xml = N'<?xml version="1.0" ?>
<Custs>
<Cust>
<name>Erik</name>
<lastname>Stark</lastname>
</Cust>
<Cust>
<name>Donald</name>
<lastname>Duck</lastname>
</Cust>
<Cust>
<name>Johnny</name>
<lastname>Walker</lastname>
</Cust>
</Custs>'
EXEC sp_xml_preparedocument @docid OUTPUT, @xml
SELECT *
FROM OPENXML (@docid, '/Custs/Cust',2)
WITH (name varchar(50), lastname varchar(50))
exec sp_xml_removedocument @docid