关于将EXCEL数据导入到SQL 2005 中的问题

kali802 2008-09-22 10:35:23
我的代码是这样的
 
SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["conStr"]);
con.Open();
string sql = @" INSERT INTO Table1 SELECT * FROM OpenRowSet ('microsoft.jet.oledb.4.0','Excel 8.0; HDR=NO;IMEX=1;database=Products.xls;','select * from [sheet1$]') ";
SqlCommand cmd = new SqlCommand(sql, con);
int line= cmd.ExecuteNonQuery();
if(line>0)
{
Response.Write("<script>alert('成功')</script>");
}


报错是这样的

链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 报错。提供程序未给出有关错误的任何信息。
无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 的数据源对象。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 报错。提供程序未给出有关错误的任何信息。
无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 的数据源对象。

请高手指教!

...全文
943 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dmiaomiao 2008-12-23
  • 打赏
  • 举报
回复
我也遇到了同样的问题,刚刚我测试了一下,通过SQL Server 2005直接导入,发现也会出错,这么来说那就不是语句和SQL Server的问题,应该是那张Excel表有问题。
yagebu1983 2008-09-22
  • 打赏
  • 举报
回复
应该是OLE DB的问题!!
kali802 2008-09-22
  • 打赏
  • 举报
回复
const string TMP_UPLOAD_PATH = "~/res/tmp";
这个是EXCEL的路径?
drummery 2008-09-22
  • 打赏
  • 举报
回复
贴一下调试的时异常信息的InnerException,可以找到更内层的原因。个人认为是“OpenRowSet ('microsoft.jet.oledb..."后面出现的问题。

我这里有一段代码也是实现导入的,基本思路是首先用DataAdapter把Excel文件读入DataSet(这个函数是比较通用的),然后再通过遍历DataSet中表格的方式插入数据库,就是纯的SQL操作了,有兴趣可以参考一下:

internal class CExcelImportHelper
{
// 我的这个地方的连接串跟你的有些出入,你不妨试一下这个。 const string CONNECTION_STRING_FORMAT = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = {0}; Extended Properties=Excel 8.0";
const string TMP_UPLOAD_PATH = "~/res/tmp";

// Reads the content of XLS file into dataset object.
public static DataSet GetDataSetFromExcel(string physicalPath, string commandString)
{
DataSet ds = null;

using (OleDbConnection conn = new OleDbConnection(string.Format(CONNECTION_STRING_FORMAT, physicalPath)))
{
OleDbCommand cmd = conn.CreateCommand();
cmd.CommandText = commandString;
using (OleDbDataAdapter adp = new OleDbDataAdapter(cmd))
{
try
{
ds = new DataSet();
adp.Fill(ds);
}
catch
{
throw;
}
finally
{
if (cmd != null)
{
cmd.Dispose();
cmd = null;
}
}
}
}

return ds;
}

}



ziyouren521125 2008-09-22
  • 打赏
  • 举报
回复
string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" + Server.MapPath("usersdb.xls") + ";Extended Properties=Excel 8.0";
OleDbConnection myConn = new OleDbConnection(strCon);
myConn.Open(); //打开数据链接,得到一个数据集
DataSet myDataSet = new DataSet(); //创建DataSet对象
string StrSql = "select * from [" + StyleSheet + "$]";
OleDbDataAdapter myCommand = new OleDbDataAdapter(StrSql, myConn);
myCommand.Fill(myDataSet, "[" + StyleSheet + "$]");
myCommand.Dispose();
DataTable DT = myDataSet.Tables["[" + StyleSheet + "$]"];
//myConn.Close();
//myCommand.Dispose();
string strConn = "Data Source=computer;DataBase=master;Uid=sa;Pwd=sa";
SqlConnection conn = new SqlConnection(strConn);


for (int j = 0; j < DT.Rows.Count; j++)
{
conn.Open();
//什么都没改,就改了一个PolicyID='" + DT.Rows[j][0].ToString()+"'" 这你原先没有' 加上'就可以了
//这查询的DT.Rows[j][0].ToString()这个值是int类型,数据库的值是字符,怎么对比啊?
//多以这没有办法去数据库对比。所以现在这个比对不起任何作用。
string sql = "select count (*) from T_PolicyBase where PolicyID='" + DT.Rows[j][0].ToString()+"'";
SqlCommand mycom = new SqlCommand(sql, conn);
int count = Int32.Parse(mycom.ExecuteScalar().ToString());
if (count > 0)
{
Response.Write("<script>alert('对不起!您已经转换了相同的数据!')</script>");
}
else
{

//主键表T_PolicyBase
//这个地方也得到policyid这个了
// string policyid = DT.Rows[j][0].ToString();
string citystrate = DT.Rows[j][1].ToString();
string cityend = DT.Rows[j][2].ToString();
string aircompany = DT.Rows[j][3].ToString();
string airno = DT.Rows[j][4].ToString();

string stratedate = DT.Rows[j][5].ToString();
string enddate = DT.Rows[j][6].ToString();
string basediscount = DT.Rows[j][7].ToString();
string office = DT.Rows[j][8].ToString();
string trip = DT.Rows[j][9].ToString();

string updatedate = DT.Rows[j][10].ToString();
string isthrow = DT.Rows[j][11].ToString();
//string suplierid = DT.Rows[j][12].ToString();
//string operationid = DT.Rows[j][13].ToString();
string brethmin = DT.Rows[j][14].ToString();

string brethmax = DT.Rows[j][15].ToString();
string isb2c = DT.Rows[j][16].ToString();
string etdz = DT.Rows[j][17].ToString();
string ismoney = DT.Rows[j][18].ToString();

//这一块生成的id都不一样。就是要这种效果吗?
//Guid每一次产生的id都不相同,所以没有办法不让她重复插入。
Guid objGuidPolicyID = Guid.NewGuid();
Guid objGuidSuplierID = Guid.NewGuid();
Guid objGuidOperationID = Guid.NewGuid();

/*string strSql = "INSERT INTO T_PolicyBase (PolicyID, CityStrate, CityEnd, AirCompany, AirNo, StrateDate, EndDate, BaseDiscount,Office, Trip," +
" UpdateDate, IsThrow, SuplierID, OperationID, BrethMin, BrethMax, ISB2C, ETDZ, ISMoney) ";
strSql = strSql + "VALUES ('" + objGuidPolicyID + "', '" + citystrate + "', '" + cityend + "', '" + aircompany + "', '" + airno + "', '" +
stratedate + "', '" + enddate + "', '" + basediscount + "','" + office + "', '" + trip + "', '" + updatedate + "', '" + isthrow + "', '" +
objGuidSuplierID + "', '" + objGuidOperationID + "', '" + brethmin + "', '" + brethmax + "', '" + isb2c + "', '" + etdz + "', '" + ismoney + "')";*/


//吧上面的PolicyID数据库里面改成自动增长的int类型,这就不用添加id了。
string strSql = "INSERT INTO T_PolicyBase ( CityStrate, CityEnd, AirCompany, AirNo, StrateDate, EndDate, BaseDiscount,Office, Trip," +
" UpdateDate, IsThrow, SuplierID, OperationID, BrethMin, BrethMax, ISB2C, ETDZ, ISMoney) ";
strSql = strSql + "VALUES ( '" + citystrate + "', '" + cityend + "', '" + aircompany + "', '" + airno + "', '" +
stratedate + "', '" + enddate + "', '" + basediscount + "','" + office + "', '" + trip + "', '" + updatedate + "', '" + isthrow + "', '" +
objGuidSuplierID + "', '" + objGuidOperationID + "', '" + brethmin + "', '" + brethmax + "', '" + isb2c + "', '" + etdz + "', '" + ismoney + "')";
SqlCommand comm = new SqlCommand(strSql, conn);
comm.ExecuteNonQuery();
if (j == DT.Rows.Count - 1)
{
Label1.Visible = true;
}
else
{
Label1.Visible = false;
}
}
conn.Close();


你可以看看,参考下这个。
贝克汉鸭 2008-09-22
  • 打赏
  • 举报
回复
根据提示是你的table1有不允许为空的字段,但是从sheet1读出来的这个字段为空了,跟踪一下你的程序吧
much0726 2008-09-22
  • 打赏
  • 举报
回复
不懂,看过就得UP

62,051

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧