0

场景:假设我有一个表,其中包含 3 列 ID、QuestionId 和 optedAnswer。我有一个表格,其中包含 n 没有问题和一些答案选项。在保存按钮上,我想将数据保存在数据库中(在我的表中)。

问题:我想将所有答案保存在一个连接中。

我采取的步骤:我制作了一个具有结构 questionId:optedAnswwer | 的字符串 questionId : optedAnswer | 等等....我写了一个程序。开始了一个循环。根据 ':' 和 '|' 拆分数据 并在一个连接中保存数据。但这是一项艰巨的任务。有什么方法可以直接保存数据而不使用循环和拆分。

4

4 回答 4

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);
        }  
于 2012-11-05T11:01:27.597 回答
1

创建一个包含所有问题和答案的 XML 字符串,并将这些 xml 字符串传递给 sql 并使用
这些 sql 内置 proc 读取 XML 的 sp_xml_preparedocument 过程。

您可以获得有关Bulk INsert的更多信息

于 2012-11-05T10:50:08.260 回答
0

还有另一种方法可以在一个连接中保存多个数据。创建一个像这样的表

CREATE TYPE [dbo].[YourTypeName] AS TABLE(
    [Col1] [bigint] NULL,
    [Col2] [datetime] NULL,
    [Col3] [bigint] NULL,
    [Col4] [bigint] NULL,
    [Col5] [datetime] NULL
)

然后写一个这样的程序....

CREATE PROCEDURE [dbo].YOURPROCEDURENAME]
( 
    @yourDataTableName YourTypeName READONLY
)
AS
    INSERT INTO TableName
    (Col1,
     Col2,                        
     Col3,
     Col4,
     Col5)
    SELECT CP.Val1,
           CP.Val2,
           CP.Val3,
           CP.Val4,
           CP.Val15)
   FROM @yourDataTableName  CP
GO

然后在后面的代码中创建一个数据表,并像这样在程序中传递该数据表......

SqlCommand cmd = new SqlCommand("YOURPROCEDURENAME");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@yourDataTableName", SqlDbType.Structured).Value = datatable;
cmd.Parameters[0].TypeName = "YourTypeName ";
于 2012-11-05T12:18:05.350 回答
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
于 2012-11-05T13:08:55.833 回答