在一个连接IN sqlserver中的一个表中保存多行

时间:2012-11-05 10:43:44

标签: c# asp.net sql-server

场景:只考虑我有一个包含3列Id,QuestionId和optedAnswer的表。我有一个表格,其中包含无问题和一些答案选项。在保存按钮上,我想将数据保存在数据库中(在我的表中)。

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

我采取的步骤:我创建了一个结构为questionId的字符串:optedAnswwer | questionId:optedAnswer |等等....  我写了一个程序。开始循环。基于':'和'|'拆分数据并在一个连接中保存数据。但这是一项严格的任务。有没有办法直接保存数据而不使用循环和拆分。

4 个答案:

答案 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