我有很多excel表,哪些列略有不同,我想将所有这些表(一次一个)导入到一个SQL TABLE中。我举个例子:
说ive编写了所需的程序并称之为Excel2sql转换器。因此,Excel2sql获取excel表并使用该excel表的数据创建数据库表,例如说我有以下excel表:
Excel_Sheet_1
-----------------------------
FirstName MiddleName LastName
John A. Smith
当我运行Excel2sql(Excel_Sheet_1)时,应该为我创建一个数据库表,其中包含以下数据:
FirstName MiddleName LastName
John A. Smith
现在,当我使用以下excel表再次运行我的程序时:
Excel_Sheet_2
-----------------------------
LastName FirstName MiddleName
wolf Kerry M.
我应该得到以下UPdATED db表:
FirstName MiddleName LastName
John A. Smith
Kerry M. wolf
请注意,它将excel表2的数据添加到现有数据库表中。 它在db列和excel表2的列之间进行了某种映射,以适当地附加数据。
现在,如果我使用以下excel表再次运行我的程序:
Sheet 3
--------
PhoneNumber LastName MiddleName FirstName
232-232 Lame K. Phoebe
我应该得到以下数据库表:
FirstName MiddleName LastName PhoneNumber
John A. Smith Null
Kerry M. wolf Null
Phoebe K. Lame 232-232
我想让代码动态地执行此操作,我的意思是,任何人都可以使用我的代码,给它一个excel表作为输入,然后我的代码将为他创建一个sql数据表,每次用户给他一个excel表,它应该更新已经创建的sql表。
请真的需要我能得到的所有帮助。我是非常新的。我编写了一个原始代码,只需将一个Excel工作表上传到ALREADY现有数据表中。 (这不是我想要的,但我必须从某处开始)
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void insertdata_Click(object sender, EventArgs e)
{
//-----------------connection to excel=--------------------------
OleDbConnection oconn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("example.xls") + ";Extended Properties=Excel 8.0");
try
{
//-----------------Commad to get all columns---------------------
OleDbCommand ocmd = new OleDbCommand("select * from [Sheet1$]", oconn);
//-----------------open the connection-----------------------
oconn.Open();
//-----------------execute the command ----------------------
OleDbDataReader odr = ocmd.ExecuteReader();
string fname = "";
string lname = "";
string mobnum = "";
//-----------------read from the datareader-------------------
while (odr.Read())
{
//-----------------insert into the db table ------------------
insertdataintosql(fname, lname, mobnum);
}
oconn.Close();
}
catch (DataException ee)
{
lblmsg.Text = ee.Message;
}
finally
{
lblmsg.Text = "Data Inserted Sucessfully";
}
}
public void insertdataintosql(string fname, string lname, string mobnum)
{
//-----------------connection to sql database----------------
SqlConnection conn = new SqlConnection("Data Source=.\\sqlexpress;AttachDbFileName=|DataDirectory|exceltosql.mdf;Trusted_Connection=yes");
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "insert into dbtable(fname,lname,mobnum) values(@fname,@lname,@mobnum)";
cmd.Parameters.Add("@fname", SqlDbType.NVarChar).Value = fname;
cmd.Parameters.Add("@lname", SqlDbType.NVarChar).Value = lname;
cmd.Parameters.Add("@mobnum", SqlDbType.NVarChar).Value = mobnum;
cmd.CommandType = CommandType.Text;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
}
我写的代码再次不是我想要的,请你帮我修改它以获得我想要的代码!
提前谢谢你:)
答案 0 :(得分:0)
首先,如果您创建一个包含例如RowID列的最小表,您将使自己的生活变得更轻松。这样,您可以避免必须在第一次传递时创建表的边缘情况。或者,您可以在第一次传递时执行此操作,并使用ALTER TABLE ...
引入第一组列,与任何其他传递相同。
下一步是查询sysobjects和syscolumns中的元数据以确定哪些列不存在,并使用ALTER TABLE ...
添加它们。
第三步是读取标题行并使用它来构建SQL语句。使用@ _1,@ _2作为参数名称,以避免在最后一步中记住名称。
最后,迭代剩余的行。对于每一行,将单元格绑定到相应的参数,然后执行语句。
答案 1 :(得分:0)
首先,非常感谢您的回复!
让我看看你是否得到了你说的话:
如果sheet1具有列A B C D,当我运行代码时,我将有一个包含A B C D列的SQL表
然后,如果我有另一张包含A B C D E列的表格,我将执行以下操作:
步骤0:获取现有表的所有列名称(在本例中为A B C D)
步骤1:从Excel工作表中读取标题行(A B C D E)
步骤2-a)比较步骤0和步骤1的结果
步骤2- b)获取我的sql表中缺少的列名并将其添加到其中(
在这种情况下,列E)所以在将它添加到表后,我的sql表将有
列A B C D E
但是当你说下面的内容时,我并不明白你的意思:
# 第三步是读取标题行并使用它来构建SQL语句。使用@ _1,@ _2作为参数名称,以避免在最后一步中记住名称。
最后,迭代剩余的行。对于每一行,将单元格绑定到相应的参数,然后执行该语句。 # 再次,我真的很感谢你的帮助:):))