Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在sqlserver的一个连接中在一个表中保存多行 场景:假设我有一个表,有3列ID,QuestionId和optEd答案。我有一个表格,包括n个问题和一些答案选项。在“保存”按钮上,我想将数据保存到数据库中(在我的表中)_C#_Asp.net_Sql Server - Fatal编程技术网

C# 在sqlserver的一个连接中在一个表中保存多行 场景:假设我有一个表,有3列ID,QuestionId和optEd答案。我有一个表格,包括n个问题和一些答案选项。在“保存”按钮上,我想将数据保存到数据库中(在我的表中)

C# 在sqlserver的一个连接中在一个表中保存多行 场景:假设我有一个表,有3列ID,QuestionId和optEd答案。我有一个表格,包括n个问题和一些答案选项。在“保存”按钮上,我想将数据保存到数据库中(在我的表中),c#,asp.net,sql-server,C#,Asp.net,Sql Server,问题:我想在一个连接中保存所有答案 我采取的步骤:我制作了一个字符串,其结构为questionId:optedAnswer | questionId:optedAnswer |等等。。。。 我写了一个程序。开始循环。基于“:”和“|”拆分数据,并在一个连接中保存数据。但这是一项艰巨的任务。有没有办法不使用循环和拆分直接保存数据。创建一个包含所有查询和AN的XML字符串,并将这些XML字符串传递给sql,然后使用 sp_xml_preparedocument过程这些sql内置的读取xml的过程 您

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

我采取的步骤:我制作了一个字符串,其结构为questionId:optedAnswer | questionId:optedAnswer |等等。。。。
我写了一个程序。开始循环。基于“:”和“|”拆分数据,并在一个连接中保存数据。但这是一项艰巨的任务。有没有办法不使用循环和拆分直接保存数据。

创建一个包含所有查询和AN的XML字符串,并将这些XML字符串传递给sql,然后使用 sp_xml_preparedocument过程这些sql内置的读取xml的过程


您可以获得有关

的更多信息,创建一个包含所有查询和ans的XML字符串,并将这些XML字符串传递给sql并使用
sp_xml_preparedocument过程这些sql内置的读取xml的过程


您可以获得有关的更多信息,请将每个问题ID及其OptedAnswer保存在Datatable中,然后将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);
        }  

将每个问题ID及其OptedAnswer保存在Datatable中,然后将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);
        }  

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

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 ";

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

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 ";

我也会选择以xml为中心的解决方案,在xml文档中准备数据,在数据库中发布,并使用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
declare@xml
声明@docid int
设置@xml=N'
埃里克
明显的
唐纳德
鸭子
约翰尼
散步的人
'
EXEC sp_xml_preparedocument@docid输出,@xml
挑选*
来自OPENXML(@docid,'/Custs/Cust',2)
使用(名称varchar(50),姓氏varchar(50))
exec sp_xml_removedocument@docid

我也会选择以xml为中心的解决方案,在xml文档中准备数据,在数据库中发布,并使用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
declare@xml
声明@docid int
设置@xml=N'
埃里克
明显的
唐纳德
鸭子
约翰尼
散步的人
'
EXEC sp_xml_preparedocument@docid输出,@xml
挑选*
来自OPENXML(@docid,'/Custs/Cust',2)
使用(名称varchar(50),姓氏varchar(50))
exec sp_xml_removedocument@docid

谢谢。我想得到同样的答案。谢谢。我的回答也是一样的。