我从某个Excel文件中导入数据,并将其保存到一个datatable中。现在,我想将这些信息保存在我的SQL Server数据库中。
我在网上看到了很多信息,但我无法理解:
OLE或SQL Server对象(比如dataAdapter或connection)吗?我需要从他的Excel文件中读取员工每周工作时间报告,并将其保存到数据库表中,在其中保存所有报告(每周用新记录更新数据库)。
Excel文件仅包含当前周的报告。
发布于 2012-01-31 07:22:16
在数据库中创建一个User-Defined TableType:
CREATE TYPE [dbo].[MyTableType] AS TABLE(
[Id] int NOT NULL,
[Name] [nvarchar](128) NULL
)并在Stored Procedure中定义一个参数
CREATE PROCEDURE [dbo].[InsertTable]
@myTableType MyTableType readonly
AS
BEGIN
insert into [dbo].Records select * from @myTableType
END并将您的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);
}要编辑存储过程中的值,可以声明具有相同类型的局部变量并将输入表插入其中:
DECLARE @modifiableTableType MyTableType
INSERT INTO @modifiableTableType SELECT * FROM @myTableType然后,您可以编辑@modifiableTableType
UPDATE @modifiableTableType SET [Name] = 'new value'发布于 2012-01-31 08:42:12
如果这是您第一次保存datatable
执行此操作(使用批量复制)。确保没有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);
} 既然你已经有了基本的记录。你只想用现有的记录检查一下新记录。你可以这么做。
这将基本上从数据库中获取现有的表。
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);然后将这个表传递给这个函数
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;
}这将返回一个新的DataTable,并更新已更改的行。请确保您正确调用该函数。DataTable首先应该是最新的。
然后,使用这个新的datatable,再次重复整块复制函数。
发布于 2012-11-29 11:37:10
我给出了一个非常简单的代码,用于我的解决方案(我有与您相同的问题陈述)。
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();我已经给出了一个预定义的表名为"abcd“(您必须注意数据库中不存在这个名称的表)。如果我的答覆对你有效,请投赞成票:)
https://stackoverflow.com/questions/9075159
复制相似问题