如何使用数据表添加一个.xls到数据库
问题描述:
我有一种方法返回一个数据表值,我想将它插入到数据库中的表中我应该怎么做? 我了Methode:如何使用数据表添加一个.xls到数据库
public DataTable Import_To_Grid(string FilePath, string Extension)
{
string conStr = "";
switch (Extension)
{
case ".xls": //Excel 97-03
conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
break;
case ".xlsx": //Excel 07
conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString;
break;
}
conStr = String.Format(conStr, FilePath, "YES");
OleDbConnection connExcel = new OleDbConnection(conStr);
OleDbCommand cmdExcel = new OleDbCommand();
OleDbDataAdapter oda = new OleDbDataAdapter();
DataTable dt = new DataTable();
cmdExcel.Connection = connExcel;
//Get the name of First Sheet
connExcel.Open();
DataTable dtExcelSchema;
dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
connExcel.Close();
//Read Data from First Sheet
connExcel.Open();
cmdExcel.CommandText = "SELECT * From [" + SheetName + "]";
oda.SelectCommand = cmdExcel;
oda.Fill(dt);
connExcel.Close();
return dt;
}
我的数据库
CREATE TYPE udt_MyTable AS TABLE
(
[CID] BIGINT IDENTITY (1, 1) NOT NULL,
[CEmail] VARCHAR (250) NOT NULL,
[UID] INT NOT NULL,
[CName] NVARCHAR (450) NULL,
[CorpName] NVARCHAR (350) NULL,
[Password] BINARY (150) NULL)
CREATE PROCEDURE stp_MyProcedure
(
@TVP as dbo.udt_MyTable readonly -- NOTE: table valued parameteres must be readonly
)
AS
INSERT INTO [dbo].[TBLCustomers]
([CEmail]
,[UID]
,[CName]
,[CorpName]
,[Password])
SELECT
[CEmail]
,[UID]
,[CName]
,[CorpName]
,[Password]
FROM @TVP
我的代码:
using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.
ConnectionStrings["ZagmaDBConnectionString"].ConnectionString))
{
FileManagement FM = new FileManagement();
string ext = ".xls";
dt = FM.Import_To_Grid(Server.MapPath(FU.FileName), ext);
var cmd = new SqlCommand("stp_MyProcedure", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@TVP", SqlDbType.Structured).Value = dt;
cmd.ExecuteNonQuery();
}
我想知道如何为工作做此方法插入到TBLCustomers
答
Sql server 2008推出了一项名为Table valued parameters. 的功能。想法是,您创建一个user defined table type并将其用作存储过程的参数,从而允许您将表格结构数据发送到该存储过程。
.Net框架的ADO.Net完全支持这种参数类型,并且它很容易处理。
所以,这里是一个非常简单的例子,就如何做到这一点。
第一个,创建一个与您的数据表结构匹配的UDT。因为它只是一个演示中,我将介绍一个简单的表,只有2列:
CREATE TYPE udt_MyTable AS TABLE
(
@Id int,
@Text varchar(50)
)
然后你需要把该类型到一个存储过程:
CREATE PROCEDURE stp_MyProcedure
(
@TVP as dbo.udt_MyTable readonly -- NOTE: table valued parameteres must be readonly
)
AS
INSERT INTO dbo.ActualTable (Id, Text)
SELECT Id, Text
FROM @TVP
GO
现在你必须要做的是从你的C#代码执行程序:
using(var con = new SqlConnection(...))
{
var cmd = new SqlCommand("stp_MyProcedure", con);
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@TVP", SqlDbType.Structured).value = dt;
cmd.ExecuteNonQuery();
}
Note:表值参数是传递给存储过程的.net数据表,如SqlDbType.Structured
。
你的数据表是否有固定的结构(我的意思是,总是有相同的列)?另外,你正在使用哪个版本的sql server? –
1.yes我的表是固定的2.sql-server 2008 R2 – sadeq