如何将数据表插入SQL Server数据库表?

Asa*_*lad 46 c# sql-server datatable

我从一些Excel文件中导入了数据,并将其保存到了一个datatable.现在我想将这些信息保存在我的SQL Server数据库中.

我在网上看到了很多信息,但我无法理解:

  1. 有人说逐行插入另一个建议批量更新......等等:它有什么好处?
  2. 我应该使用OLESQL Server对象(如dataAdapterconnection)?

我需要从他的Excel文件中读取员工每周工时报告并将其保存到保存所有报告的数据库表中(每周用新记录更新数据库).

Excel文件仅包含当前周的报告.

Nav*_*adi 65

User-Defined TableType在数据库中创建一个:

CREATE TYPE [dbo].[MyTableType] AS TABLE(
    [Id] int NOT NULL,
    [Name] [nvarchar](128) NULL
)
Run Code Online (Sandbox Code Playgroud)

并在您的Stored Procedure:中定义一个参数:

CREATE PROCEDURE [dbo].[InsertTable]
    @myTableType MyTableType readonly
AS
BEGIN
    insert into [dbo].Records select * from @myTableType 
END
Run Code Online (Sandbox Code Playgroud)

DataTable直接发送到sql server:

using (var command = new SqlCommand("InsertTable") {CommandType = CommandType.StoredProcedure})
{
    var dt = new DataTable(); //create your own data table
    command.Parameters.Add(new SqlParameter("@myTableType", dt));
    SqlHelper.Exec(command);
}
Run Code Online (Sandbox Code Playgroud)

要编辑存储过程内的值,可以声明具有相同类型的局部变量并将输入表插入其中:

DECLARE @modifiableTableType MyTableType 
INSERT INTO @modifiableTableType SELECT * FROM @myTableType
Run Code Online (Sandbox Code Playgroud)

然后,您可以编辑@modifiableTableType:

UPDATE @modifiableTableType SET [Name] = 'new value'
Run Code Online (Sandbox Code Playgroud)


rof*_*s91 23

如果这是您第一次保存数据表

这样做(使用批量复制).确保没有PK/FK约束

SqlBulkCopy bulkcopy = new SqlBulkCopy(myConnection);
//I assume you have created the table previously
//Someone else here already showed how  
bulkcopy.DestinationTableName = table.TableName;
try                             
{                                 
    bulkcopy.WriteToServer(table);                            
}     
    catch(Exception e)
{
    messagebox.show(e.message);
} 
Run Code Online (Sandbox Code Playgroud)

既然你已经有了基本的记录.而你只想查看现有记录的新记录.你可以这么做.

这基本上将从数据库中获取现有表

DataTable Table = new DataTable();

SqlConnection Connection = new SqlConnection("ConnectionString");
//I assume you know better what is your connection string

SqlDataAdapter adapter = new SqlDataAdapter("Select * from " + TableName, Connection);

adapter.Fill(Table);
Run Code Online (Sandbox Code Playgroud)

然后将此表传递给此函数

public DataTable CompareDataTables(DataTable first, DataTable second)
{
    first.TableName = "FirstTable";
    second.TableName = "SecondTable";

    DataTable table = new DataTable("Difference");

    try
    {
        using (DataSet ds = new DataSet())
        {
            ds.Tables.AddRange(new DataTable[] { first.Copy(), second.Copy() });

            DataColumn[] firstcolumns = new DataColumn[ds.Tables[0].Columns.Count];

            for (int i = 0; i < firstcolumns.Length; i++)
            {
                firstcolumns[i] = ds.Tables[0].Columns[i];
            }

            DataColumn[] secondcolumns = new DataColumn[ds.Table[1].Columns.Count];

            for (int i = 0; i < secondcolumns.Length; i++)
            {
                secondcolumns[i] = ds.Tables[1].Columns[i];
            }

            DataRelation r = new DataRelation(string.Empty, firstcolumns, secondcolumns, false);

            ds.Relations.Add(r);

            for (int i = 0; i < first.Columns.Count; i++)
            {
                table.Columns.Add(first.Columns[i].ColumnName, first.Columns[i].DataType);
            }

            table.BeginLoadData();

            foreach (DataRow parentrow in ds.Tables[0].Rows)
            {
                DataRow[] childrows = parentrow.GetChildRows(r);
                if (childrows == null || childrows.Length == 0)
                    table.LoadDataRow(parentrow.ItemArray, true);
            }

            table.EndLoadData();

        }
    }

    catch (Exception ex)
    {
        throw ex;
    }

    return table;
}
Run Code Online (Sandbox Code Playgroud)

这将返回一个新的DataTable,其中更改的行已更新.请确保您正确调用该功能.DataTable首先应该是最新的.

然后使用这个新数据表重复重复批量复制功能.


Luv*_*Luv 7

我给出了一个非常简单的代码,我在我的解决方案中使用了(我和你的问题语句一样)

    SqlConnection con = connection string ;
//new SqlConnection("Data Source=.;uid=sa;pwd=sa123;database=Example1");
con.Open();
string sql = "Create Table abcd (";
foreach (DataColumn column in dt.Columns)
{
    sql += "[" + column.ColumnName + "] " + "nvarchar(50)" + ",";
}
sql = sql.TrimEnd(new char[] { ',' }) + ")";
SqlCommand cmd = new SqlCommand(sql, con);
SqlDataAdapter da = new SqlDataAdapter(cmd);
cmd.ExecuteNonQuery();
using (var adapter = new SqlDataAdapter("SELECT * FROM abcd", con)) 
using(var builder = new SqlCommandBuilder(adapter))
{
adapter.InsertCommand = builder.GetInsertCommand();
adapter.Update(dt);
// adapter.Update(ds.Tables[0]); (Incase u have a data-set)
}
con.Close();
Run Code Online (Sandbox Code Playgroud)

我给了一个预定义的表名为"abcd"(你必须注意数据库中不存在这个名称的表).如果它适合你,请投票给我答案!!!! :)