现在是 需要把一些xls文件上传到数据库并新建新表,表的列名结构不一样。该怎么做?我在网上搜了一晚,看到opendatasourse的方法挺好用的,可是网上都是直接在sqlserver操作的。
下面这个代码能实现吗?
BaseClass.SqlClass sqlclass = new HRP.BaseClass.SqlClass();
                         SqlConnection con = sqlclass.SqlConBind();
                         con.Open();
                         SqlCommand scd = new SqlCommand("SELECT   * INTO NEWTABLE OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;HDR=YES;DATABASE=c:\a.xls',sheet1$)", con);
                         scd.CommandTimeout = 20;
                         scd.ExecuteNonQuery();
                         con.Close();
报错信息:未处理的“System.Data.SqlClient.SqlException”类型的异常出现在 System.Data.dll 中。其他信息: 关键字 'OPENROWSET' 附近有语法错误。
   刚开始摸索编程觉得它很难哦,遇到问题的时候很多时候找不到方向。有些气馁。熬夜好伤哦,为什么男孩子那么喜欢熬夜?不是很熟悉csdn的操作,如果哪里不对,请帮我指出。

解决方案 »

  1.   

    CREATE TABLE #NEWTABLE (.....)INSERT INTO NEWTABLE
    SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;HDR=YES;DATABASE=c:\a.xls',sheet1$)
      

  2.   

    因为你的EXCEL与SQL中表的列不一致,所以需要先读取EXCEL内容,然后再插入数据
    将EXCEL中的内容读到DataTable中,这个代码网上很多,自己搜一下就可以,
    从EXCEL中读取到DataTable后,
    foreach( DataRow dr in ExcelTable.Rows) 
    {
     //读取行中的内容,自己写SQL语句将数据插入SQL表中
    }
      

  3.   

    --如果是导入数据到现有表,采用
    INSERT INTO 表 SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'Excel 8.0; HDR=YES; DATABASE=c:\a.xls',sheet1$)--如果是导入数据并新增表,则采用
    SELECT * INTO 表 FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'Excel 8.0; HDR=YES; DATABASE=c:\a.xls',sheet1$)
      

  4.   

    这么改试试
    SqlCommand scd = new SqlCommand("SELECT * INTO NEWTABLE FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;HDR=YES;DATABASE=c:\a.xls',sheet1$)", con);
      

  5.   

    把FROM补上去 ,出现了其他的错误。
    未处理的“System.Data.SqlClient.SqlException”类型的异常出现在 System.Data.dll 中。其他信息: 链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 报错。提供程序未给出有关错误的任何信息。
    无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 的数据源对象。
      

  6.   

    好像还是sql语句执行的问题,你的excel表和数据库是在同一个服务器上吗?
    打开一个查询分析器,直接输入那个sql语句,看看有什么提示,能不能成功
      

  7.   

    谢谢你热心的回答。
    excel表和数据库是在同一个服务器上,在vs2005提供的sql查询里执行了了出现的错误:
    SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。 
     可是我已经在SQL Server 配置工具---SQL SERVER 外围应用配置器----功能的外围应用配置器 打开了对 openrowset 和 opendatasourse的支持,到底是哪里不对呢?
      

  8.   

    执行  
    exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Ad Hoc Distributed Queries',1;RECONFIGURE;后在sql查询器执行SELECT * INTO NEWTABLE FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;HDR=YES;DATABASE=c:\a.xls',sheet1$) 成功了。这么说sql语句是正确的咯?
    可是在程序里还是出现下面的错误。
    未处理的“System.Data.SqlClient.SqlException”类型的异常出现在 System.Data.dll 中。其他信息: 链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 报错。提供程序未给出有关错误的任何信息。
    无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 的数据源对象。
      

  9.   

    --启用Ad Hoc Distributed Queries:
    exec sp_configure 'show advanced options',1 reconfigure
    exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigureSELECT * INTO NEWTABLE FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;HDR=YES;DATABASE=c:\a.xls',sheet1$--使用完成后,关闭Ad Hoc Distributed Queries:
    exec sp_configure 'Ad Hoc Distributed Queries',0 reconfigure
    exec sp_configure 'show advanced options',0 reconfigure 难道要把使用和关闭Ad Hoc Distributed Queries的语句都放到SqlCommand里面一起执行?
      

  10.   

    需要关闭吗?直接执行sql语句是行的,在程序里就不行了。
      

  11.   

    登陆查询分析器的用户和C#里连接数据库的用户是一样的吗? 
    C#也是用sa连接的吗? 是不是C#里用的数据库用户权限不够啊?把SqlCommand里的sql语句换成一个其他简单的语句运行试试,如果能成功
    应该说明还是执行这个SQL语句时有问题.
    SELECT * INTO NEWTABLE FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;HDR=YES;DATABASE=c:\a.xls',sheet1$)还有如果和启用Ad Hoc Distributed Queries的语句一起执行的话好像还得加个GO要是能看到C#运行时具体错误提示就好了
      

  12.   

    Excel 文件已经打开的时候执行就是这个提示
    消息 7399,级别 16,状态 1,第 1 行
    链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 报错。提供程序未给出有关错误的任何信息。
    消息 7303,级别 16,状态 1,第 1 行
    无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 的数据源对象。
      

  13.   

    Excel文件没有打开,你在c#中运行这个有成功过。
      

  14.   

    SELECT * INTO NEWTABLE FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;HDR=YES;DATABASE=c:\a.xls',sheet1$) 
    这段在sql是成功的。
    但是插在在C#代码里就出现错误。
    未处理的“System.Data.SqlClient.SqlException”类型的异常出现在 System.Data.dll 中。
    其他信息: 链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 报错。提供程序未给出有关错误的任何信息。
    无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 的数据源对象。 大家帮帮我想一下啊。非常感谢。这个语句在C#里到底是怎么用。
      

  15.   

    在我这里C#中这样写是可以的
    SELECT * into newtable FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source=""c:\a.xls"";User ID=;Password=;Extended properties=Excel 8.0')...[sheet1$]
      

  16.   

    string strSQL = @"SELECT * into newtable FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source=""c:\a.xls"";User ID=;Password=;Extended properties=Excel 8.0')...[sheet1$]";
      

  17.   

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.Data.SqlClient;
    using System.Reflection;  
    using Microsoft.Office.Core;   
    using Microsoft.Office.Interop.Excel;
    using ExcelApplication=Microsoft.Office.Interop.Excel.Application; private void button2_Click(object sender, System.EventArgs e)
    {
    string message="确认导入?";
    string caption="导入对话框";
    int wxc=1;
    int row=2;
    string wFinterid;
    string combo="";
    bool result=false;
    MessageBoxButtons buttons = MessageBoxButtons.YesNo;
    DialogResult rResult;
    rResult=MessageBox.Show(this,message,caption,buttons);

    if(rResult==DialogResult.Yes)
    {
    if ((comboBox1.Text!="")&&(comboBox2.Text!="") &&(textBox1.Text!="") )
        combo=comboBox1.Text.ToString();  
    else
    {
    MessageBox.Show("仓库和仓位和导入文件路径选择不能为空");
    return;
    }
                        
    this.Cursor=Cursors.WaitCursor;  
    ExcelApplication excel=new ExcelApplication();
    excel.Visible=true;
    object missing=System.Reflection.Missing.Value;
    try
    {

    excel.Workbooks.Open(textBox1.Text,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);
    Worksheet worksheet=(Worksheet)excel.ActiveSheet;
    Range rELNO=worksheet.get_Range("A"+row,Missing.Value);
    Object oELNO=rELNO.Select();
    string wELNO=excel.ActiveCell.Text.ToString();


    string eSql="insert into icstockbillentry(fbrno,finterid,fentryid,fitemid,fqtymust,fqty,fprice,"+
    "famount,funitid,fauxprice,fauxqty,fauxqtymust,fqtyactual,fauxqtyactual,"+
    "fdcspid,fdcstockid,fentryselfc0230)" +
    "values('0',"+wFinterid+","+wxc+","+eFitemid+","+wauxqtymust+","+wauxqtymust+","+welnoprice+","+tmount+","+wfunitid+","+welnoprice+","+wauxqtymust+","+wauxqtymust+",0,0,"+cwfspid+","+cwfitemid+","+wreason.ToString()+")";
                                             //用于访问数据库
                                                   conndatabase conne=new conndatabase(cserver,cdatabase,cuser,cpwd);
    conne.ExecuteSql(eSql); 
    wxc++;   
    wRow++;
    rELNO=worksheet.get_Range("A"+wRow,Missing.Value);
    oELNO=rELNO.Select();
    wELNO=excel.ActiveCell.Text.ToString(); }       

    }
    else
    {
    MessageBox.Show("请重新检查导入文件内容");
    return;
    } } catch(Exception ex)
    {
    MessageBox.Show(ex.Message) ;
    this.Cursor=Cursors.Default;  }
    }


    else
    {
    System.Windows.Forms.Application.Exit();     
    }
    this.Cursor=Cursors.Default; 
    }加上用于访问数据库的类
    using System;
    using System.Data.SqlClient;
    using System.Data;
    using System.Windows.Forms;     
    namespace klose
    {
    /// <summary>
    /// conndatabase 的摘要说明。
    /// </summary>
    public class conndatabase
    {
    private SqlConnection Connstr;
    private SqlDataAdapter ConnAdapter;
    private SqlCommand Strcommand;
    string mConnString;
    public conndatabase(string cserver,string cdatabase,string cuid,string cpwd)
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    Connstr=new SqlConnection(); 
    mConnString="server="+cserver+";database="+cdatabase+";uid="+cuid+";pwd="+cpwd+""; Connstr.ConnectionString=mConnString;
    ConnAdapter=new SqlDataAdapter();
    Strcommand=new SqlCommand();  
    }
    public void Open()
    {
    try
    {
    if(Connstr.State != ConnectionState.Open)
    Connstr.Open();
    }
    catch(System.Exception e)
    {
    throw new System.Exception("不能打开" + e.Message);
    }
    } public bool ExecuteSql(string SQL)
    {
    try
    {
    if(Connstr.State!=ConnectionState.Open)
    {
    Connstr.Open();
    }
    Strcommand = Connstr.CreateCommand();
    Strcommand.CommandText =SQL;
    int i=Strcommand.ExecuteNonQuery();
    Connstr.Close();
    return true;
    }
    catch(System.Exception)
    {
    if(Connstr.State!=ConnectionState.Closed)
    Connstr.Close();
    return false;
    }
    } public SqlDataReader ExecuteReaderSqls(string SQL)
    {
    try
    {

    if (Connstr.State !=ConnectionState.Open)
    Connstr.Open();
    SqlCommand sqlExectueCommand = new SqlCommand();
    sqlExectueCommand.CommandText =SQL;
    sqlExectueCommand.Connection = Connstr;
    SqlDataReader myDataReader = sqlExectueCommand.ExecuteReader();
    return myDataReader;
    }
    catch(System.Exception e)
    {
    if(Connstr.State!=ConnectionState.Closed)
    Connstr.Close();
    throw new SystemException("不能打开"+ e.Message);
    }
    }
    public void close()
    {
    if (Connstr.State!=ConnectionState.Closed)
    {
    Connstr.Close(); 
    } }
    }
    }你需要增加openfiledialog1,要分三部分,一部分是要打开EXCEL读取数据,还有一个就是访问数据库的类,再就是插入数据。
      

  18.   

    private void button1_Click(object sender, System.EventArgs e)
    {
    openFileDialog1.Filter = "Microsoft Excel Files |*.xls";
    openFileDialog1.Title = "Select a Microsoft Excel Files";
    if(openFileDialog1.ShowDialog() == DialogResult.OK)
    {

    System.IO.StreamReader sr = new 
    System.IO.StreamReader(openFileDialog1.FileName);
    textBox1.Text=openFileDialog1.FileName;  
    textBox1.ForeColor=Color.Blue;  
    sr.Close();
    }
    }
    打开EXCEL
      

  19.   


    string strSQL = @"SELECT * into newtable FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source=""c:\a.xls"";User ID=;Password=;Extended properties=Excel 8.0')...[sheet1$]";
    测试成功了。谢谢大家,特别是lucky大侠。
    我读取了文件的名字变量filename作为新表的名称。newtable这里怎么改,我以为是'"+filename+"'这样的格式,可是c#报错了。
    还有data source后面的路径
      

  20.   

    看这个吧:

    C#读取Excel并存入数据库
      

  21.   

    这里应该行
    http://blog.csdn.net/laoyingisme/archive/2007/12/28/1999020.aspx
      

  22.   

    字符串前面加@以后里面的字符原样输出(如路径C:\a.xls),但是双引号(")要写成两个双引号("")
    不加@的普通字符需要转义,如(C:\\a.xls),双引号(")表示成(\")
    filename 这样连起来就行了吧
    C# codestring strSQL = @"SELECT * into "+filename+@" FROM OpenDataSource( 'Microsoft...
      

  23.   

     string strSQL = @"SELECT * into " + tbname;
    strSQL += " FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source=" + path + ";User ID=;Password=;Extended properties=Excel 8.0')...[sheet1$]";
    已经可以了,后面不用重复添加@。
    现在的问题是,如果我想建表的时候,同时插入 自动编号的id和 记录时间 datetime,这样的话怎么做的?谢谢大家。
      

  24.   

    如果数据库是SQL2005,SQL语句这样写
    SELECT ROW_NUMBER() OVER (ORDER BY GETDATE()) AS ID,
    *,
    GETDATE() AS ACTDTTM 
    INTO newtable
    FROM OPENDATASOURCE( 'MICROSOFT.JET.OLEDB.4.0','DATA SOURCE="C:\a.xls";USER ID=;PASSWORD=;EXTENDED PROPERTIES=EXCEL 8.0')...[SHEET1$]
      

  25.   

    我也遇见同样的问题,搞了一个下午,数据库里面都可以,但是一道程序里面就报错:
    配置选项 'show advanced options' 已从 1 更改为 1。请运行 RECONFIGURE 语句进行安装。
    配置选项 'Ad Hoc Distributed Queries' 已从 1 更改为 1。请运行 RECONFIGURE 语句进行安装。
    消息 7399,级别 16,状态 1,第 1 行
    链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 报错。提供程序未给出有关错误的任何信息。
    消息 7303,级别 16,状态 1,第 1 行
    无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 的数据源对象。