如何使用数据表将.xls添加到数据库

本文关键字:添加 数据库 xls 何使用 数据表 | 更新日期: 2023-09-27 18:33:06

我有一个返回数据表值的方法,我想把它插入到数据库中的表中,我应该怎么做?我的方法:

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

如何使用数据表将.xls添加到数据库

Sql Server 2008 引入了一个名为 Table 值参数的功能。其思路是创建一个用户定义的表类型,并将其用作存储过程的参数,从而允许您将表结构数据发送到该存储过程。
.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();
}

注意:表值参数是作为SqlDbType.Structured传递给存储过程的 .net 数据表。