本人是初学者,问一个简单问题。
我做一个数据导出、导入程序,用dataset将4个表导出到一个xml文件中,请问,如果通过编码将这个xml文件中的数据导入到另一个数据库中(两个库的表结构一致)!
急。

解决方案 »

  1.   

    现在的SQL好像还不能对XML直接操作吧?那只有读XML数据,用SQL语句往数据库中插入记录了~
      

  2.   

    http://dotnet.aspx.cc/ShowDetail.aspx?id=6ADD72FB-3C6D-47AD-7D68-21EB9E395275这个文件中有详细的描述
      

  3.   

    To:DeanMonica(夏天的叶子) 
    我的数据库是用的ODBC而不是OleDb,有没有类似的例子?
      

  4.   

    先读出来到DataSet中,然后Insert到TABLE中吧,这样简单易行.
      

  5.   

    SQL  2005   好像可以直接导么?
      

  6.   

    To:KJ_Wang(Java Every Day)
    Xml我已读到DataSet中,我很关心如何Insert(update)到数据库中
      

  7.   

    方法一:XML->DATASET->数据库
    方法二:解析XML,提取数据插入到数据库中
      

  8.   

    DATASET->数据库
    直接使用数据适配器的UPDATE方法进行更新就可以
      

  9.   

    首先安装sql xml sp_xml_preparedocument
     
    sp_xml_preparedocument 返回一个句柄,可用于访问 XML 文档的新创建的内部表示方式。该句柄在连接到 Microsoft® SQL Server™ 2000 期间保持有效,直到重置连接或执行 sp_xml_removedocument 使句柄无效为止。
     
    说明  分析过的文档存储在 SQL Server 2000 的内部高速缓存中。MSXML 语法分析器使用 SQL Server 可用总内存的八分之一。若要避免内存不足,请运行 sp_xml_removedocument 以释放内存。
    语法
    sp_xml_preparedocument hdoc OUTPUT
    [, xmltext]
    [, xpath_namespaces]参数
    hdoc是新创建的文档的句柄。hdoc 的数据类型为 integer。[xmltext]是原 XML 文档。MSXML 语法分析器分析该 XML 文档。xmltext 是 text 类型(char、nchar、varchar、nvarchar、text 或 ntext)的参数。默认值是 NULL,在这种情况下,将创建空 XML 文档的内部表示法。[xpath_namespaces]指定 OPENXML 的行和列 XPath 表达式中所使用的命名空间声明。默认值是 <root xmlns:mp='urn:schemas-microsoft-com:xml-metaprop'>。
    xpath_namespaces 通过符合语法规则的 XML 文档的方式,为在 OPENXML 的 Xpath 表达式中使用的前缀提供命名空间 URI。xpath_namespaces 声明前缀必须用于引用命名空间 urn:schemas-microsoft-com:xml-metaprop,该命名空间提供有关分析后的 XML 元素的元数据。尽管可以使用此方法为元属性命名空间重新定义命名空间前缀,但此命名空间不会丢失。此前缀 mp 对 urn:schemas-microsoft-com:xml-metaprop 仍有效,即使 xpath_namespaces 不包含此类声明。xpath_namespaces 是 text 类型(char、nchar、varchar、nvarchar、text 或 ntext)的参数。 返回代码值
    0(成功)或 >0(失败)权限
    执行权限默认授予 public 角色。示例
    A. 为符合语法规则的 XML 文档准备内部表示方式
    下例返回作为输入提供的新创建的 XML 文档内部表示法的句柄。在对 sp_xml_preparedocument 的调用中,使用了默认命名空间前缀映射。DECLARE @hdoc int
    DECLARE @doc varchar(1000)
    SET @doc ='
    <ROOT>
    <Customer CustomerID='VINET' ContactName='Paul Henriot'>
       <Order CustomerID='VINET' EmployeeID='5' OrderDate='1996-07-04T00:00:00'>
          <OrderDetail OrderID='10248' ProductID='11' Quantity='12'/>
          <OrderDetail OrderID='10248' ProductID='42' Quantity='10'/>
       </Order>
    </Customer>
    <Customer CustomerID='LILAS' ContactName='Carlos Gonzlez'>
       <Order CustomerID='LILAS' EmployeeID='3' OrderDate='1996-08-16T00:00:00'>
          <OrderDetail OrderID='10283' ProductID='72' Quantity='3'/>
       </Order>
    </Customer>
    </ROOT>'
    --Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
    -- Remove the internal representation.
    exec sp_xml_removedocument @hdocB. 为带 DTD 的符合语法规则的 XML 文档准备内部表示方式
    下例返回作为输入提供的新创建的 XML 文档内部表示法的句柄。存储过程根据文档中包含的 DTD 来验证装载的文档。在对 sp_xml_preparedocument 的调用中,使用了默认命名空间前缀映射。DECLARE @hdoc int
    DECLARE @doc varchar(2000)
    SET @doc = '
    <?xml version='1.0' encoding='UTF-8' ?> 
    <!DOCTYPE root 
    [<!ELEMENT root (Customers)*>
    <!ELEMENT Customers EMPTY>
    <!ATTLIST Customers CustomerID CDATA #IMPLIED ContactName CDATA #IMPLIED>]>
    <root>
    <Customers CustomerID='ALFKI' ContactName='Maria Anders'/>
    </root>'EXEC sp_xml_preparedocument @hdoc OUTPUT, @docC. 指定命名空间 URI
    下例返回作为输入提供的新创建的 XML 文档内部表示法的句柄。在对 sp_xml_preparedocument 的调用中,保留了元属性命名空间映射的 mp 前缀,并将 xyz 映射前缀添加到了命名空间 urn:MyNamespace。DECLARE @hdoc int
    DECLARE @doc varchar(1000)
    SET @doc ='
    <ROOT>
    <Customer CustomerID='VINET' ContactName='Paul Henriot'>
       <Order CustomerID='VINET' EmployeeID='5' 
               OrderDate='1996-07-04T00:00:00'>
          <OrderDetail OrderID='10248' ProductID='11' Quantity='12'/>
          <OrderDetail OrderID='10248' ProductID='42' Quantity='10'/>
       </Order>
    </Customer>
    <Customer CustomerID='LILAS' ContactName='Carlos Gonzlez'>
       <Order CustomerID='LILAS' EmployeeID='3' 
               OrderDate='1996-08-16T00:00:00'>
          <OrderDetail OrderID='10283' ProductID='72' Quantity='3'/>
       </Order>
    </Customer>
    </ROOT>'
    --Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc, '<root xmlns:xyz='run:MyNamespace'/>'
      

  10.   

    创建一个DataTable 再 把DataTable 写如数据库~
      

  11.   

    To:laji97(未完成~) 
    如何将DataTable 写入数据库?
      

  12.   

    奇怪,用dataset.writeXml()导出的xml,用adapter.update竟然提示:ERROR [22018] [DataDirect][ODBC Sybase Wire Protocol driver][SQL Server]Implicit
     conversion from datatype 'CHAR' to 'DECIMAL' is not allowed.  Use the CONVERT f
    unction to run this query.
      

  13.   

    用dataset.writeXml()导出的xml,用adapter.update总是提示:ERROR [22018] [DataDirect][ODBC Sybase Wire Protocol driver][SQL Server]Implicit
     conversion from datatype 'CHAR' to 'DECIMAL' is not allowed.  Use the CONVERT f
    unction to run this query.代码如下:
    OdbcDataAdapter adapter = new OdbcDataAdapter("select * from table1",Conn1);
    OdbcCommandBuilder builder = new OdbcCommandBuilder(adapter);

    adapter.Fill(ds_main,"table1");
    ds_main.ReadXml("c:\\1.xml",XmlReadMode.ReadSchema);
    Console.WriteLine("table:{0}", ds_main.Tables[0].ToString());
    急!请帮帮忙
      

  14.   

    类型不匹配,把'CHAR'型转换成'DECIMAL'
      

  15.   

    源码:OdbcDataAdapter adapter = new OdbcDataAdapter("select * from table1",Conn1);
    OdbcCommandBuilder builder = new OdbcCommandBuilder(adapter);adapter.Fill(ds_main,"table1");
    ds_main.ReadXml("c:\\1.xml",XmlReadMode.ReadSchema);
    Console.WriteLine("table:{0}", ds_main.Tables[0].ToString());
    DataTable datatable = ds_main.Tables[0];
    ds_main.Tables[0].PrimaryKey = new DataColumn[] {ds_main.Tables[0].Columns[0]};
    DataTable datatable = ds_main.Tables[0];
    DataRow row = ds_main.Tables[0].Rows[0];
    row["col1"] = "xp";
    adapter.Update(ds_main,"table1");
    ds_main.Tables[0].AcceptChanges();
    Conn1.Close();
      

  16.   

    我发现update时字段为char、int型的都可以提交,但是decimal型就不可以。我用的sybase odbc驱动。
      

  17.   

    system.decimal 和 OdbcType.Decimal 类型有什么区别?就是update不了,急呀
      

  18.   

    同样的代码在vs2005下执行update()出现下面异常:Exception:System.InvalidOperationException: Dynamic SQL generation is not suppo
    rted against a SelectCommand that does not return any base table information.
      

  19.   

    先别读Xml,看这样能否成功:ds_main.ReadXml("c:\\1.xml",XmlReadMode.ReadSchema);
    Console.WriteLine("table:{0}", ds_main.Tables[0].ToString());
    DataTable datatable = ds_main.Tables[0];
    ds_main.Tables[0].PrimaryKey = new DataColumn[] {ds_main.Tables[0].Columns[0]};
    DataTable datatable = ds_main.Tables[0];
    DataRow row = ds_main.Tables[0].Rows[0];
    row["col1"] = "xp";这一段改成:
    ds_main.Tables["table1"].Rows[0]["col1"]="xp";试下看..如果没有问题,那就说明可能是你操作xml的问题了..
      

  20.   

    to:liujia_0421(SnowLover) 
    还是不行:
    Exception:System.InvalidOperationException: Dynamic SQL generation is not suppo
    rted against a SelectCommand that does not return any base table information.
      

  21.   

    那我觉得应该是你数据库中表结构的问题了..这么简单的一个操作都会报错,真的有点不可思议...重建个表试试,记住一定要有主键..
    用commandBuilder的几点限制:注意点: 
      1.只能更新一个表,不能更新两个或两个以上相关联的表
      2.表中必须有主键
      3.更新的表中字段不能有image类型的
      

  22.   

    顺便问一句,你的这条查询命令取到值了吗?断点调试一下,看DataSet中是否有查询到的记录..
      

  23.   

    adapter.Update(ds,"table1");
    为什么没有这句呢。不是说要更新吗。
    高手给我发信,谢谢。
      

  24.   

    TO:
    adapter.Update(ds,"table1");
    为什么没有这句呢。不是说要更新吗。有这句的,仔细看..
      

  25.   

    查询命令没有取到任何数据,但是有Read(xml),xml是有一条记录数据的
      

  26.   

    晕呀,换成sqlserver数据库一点问题没有,sybaseASE就不行,是不是ASE odbc驱动的问题?
      

  27.   

    TO:sybaseASE就不行,是不是ASE odbc驱动的问题?你这么一说,应该就是了..呵呵.我主要用SqlServer+Oracle,别的数据库很少用..
      

  28.   

    好像是Odbc.type 是decimal的问题,大家知道吗?
      

  29.   

    adapter.update()时出现异常:System.InvalidOperationException: Parameter[5] '' has no default value.
    Parameter[6] '' has no default value.
    Parameter[7] '' has no default value.
    Parameter[13] '' has no default value.
    Parameter[15] '' has no default value.如何解决?
      

  30.   

    代码如下:
    string select = "select count(*) as col_num from syscolumns where id = (select id from sysobjects where  name = '" + sTableName + "')";
                            int col_num = 0;
                            string sInsert = "Insert " + sTableName +" (";
                            command = new OleDbCommand(select, Conn_S);
                            reader = command.ExecuteReader();
                            while (reader.Read())
                            {
                                col_num = System.Convert.ToInt16(reader[col_num]);                        }                        
                            select = "select name from syscolumns where id = (select id from sysobjects where  name = '" + sTableName + "')";
                            command = new OleDbCommand(select, Conn_S);
                            reader = command.ExecuteReader();
                            while (reader.Read())
                            {
                                
                                sInsert += reader["name"].ToString() + ",";
                                
                            }
                            //处理掉最后的','
                            sInsert = sInsert.Substring(0, sInsert.Length - 1);
                            sInsert += ") VALUES ( ";
                            for (int i = 1; i <= col_num; i++)
                            {
                                sInsert += "?,";
                            }
                            //处理掉最后的','
                            sInsert = sInsert.Substring(0, sInsert.Length - 1);                        //生成最后的insert z (a,b,c,d) values(?,?,?, ?)
                            sInsert += ")";                        //生成adapter
                            ole_adapter.InsertCommand = new OleDbCommand(sInsert,Conn_S);                        select = "select name ,(select name from systypes where usertype = syscolumns.usertype) as typename ,length,status from syscolumns where id = (select id from sysobjects where  name = '" + sTableName + "')";
                            command = new OleDbCommand(select, Conn_S);
                            reader = command.ExecuteReader();
                            while (reader.Read())
                            {
                                string col_name = reader["name"].ToString().Trim();
                                string col_type = reader["typename"].ToString().Trim();
                                int length = System.Convert.ToInt32(reader["length"].ToString());
                                int status = System.Convert.ToInt32(reader["status"].ToString());
                                OleDbType dbType = OleDbType.Char;
                               
                                switch (col_type)
                                {
                                    case "char": 
                                        dbType = OleDbType.Char;
                                        break;
                                    case "varchar":
                                        dbType = OleDbType.VarChar;
                                        break;
                                    case "decimal":
                                        dbType = OleDbType.Decimal;
                                        break;
                                    case "int":
                                        dbType = OleDbType.Integer;
                                        break;
                                    case "smallint":
                                        dbType = OleDbType.SmallInt;
                                        break;
                                    case "datetime":
                                        dbType = OleDbType.DBTimeStamp;
                                        break;
                            
                                    default:
                                        dbType = OleDbType.Char;
                                        break;
                                }
                                
                                ole_adapter.InsertCommand.Parameters.Add("@" + col_name, dbType, length,col_name);
                                //处理可空的字段
                                if (status == 8)
                                {
                                    ole_adapter.InsertCommand.Parameters["@" + col_name].IsNullable = true;
                                }
      

  31.   

    好长..具体在哪抛出的异常啊>>
      

  32.   

    很多问题,帮你改了部分:但是你还有那么多参数还没有添加啊..我下面也给你标志了.            string select = "select count(*) as col_num from syscolumns where id = (select id from sysobjects where  name = '" + sTableName + "')";
                int col_num = 0;
                string sInsert = "Insert into" + sTableName + " (";
                command = new OleDbCommand(select, Conn_S);
                reader = command.ExecuteReader();
                if (reader.Read())
                {
                    col_num = System.Convert.ToInt32(reader["col_num"]);            }
                //关闭Reader
                reader.Close();            select = "select name from syscolumns where id = (select id from sysobjects where  name = '" + sTableName + "')";
                command = new OleDbCommand(select, Conn_S);
                reader = command.ExecuteReader();
                while (reader.Read())
                {                sInsert += reader["name"].ToString() + ",";            }
                //关闭Reader
                reader.Close();            //处理掉最后的','
                sInsert = sInsert.Substring(0, sInsert.Length - 1);
                sInsert += ") VALUES ( ";
                for (int i = 1; i <= col_num; i++)
                {
                    sInsert += "?,";
                }
                //处理掉最后的','
                sInsert = sInsert.Substring(0, sInsert.Length - 1);            //生成最后的insert z (a,b,c,d) values(?,?,?, ?)
                sInsert += ")";            //生成adapter
                ole_adapter.InsertCommand = new OleDbCommand(sInsert, Conn_S);            select = "select name ,(select name from systypes where usertype = syscolumns.usertype) as typename ,length,status from syscolumns where id = (select id from sysobjects where  name = '" + sTableName + "')";
                command = new OleDbCommand(select, Conn_S);
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    string col_name = reader["name"].ToString().Trim();
                    string col_type = reader["typename"].ToString().Trim();
                    int length = System.Convert.ToInt32(reader["length"].ToString());
                    int status = System.Convert.ToInt32(reader["status"].ToString());
                    OleDbType dbType = OleDbType.Char;                switch (col_type)
                    {
                        case "char":
                            dbType = OleDbType.Char;
                            break;
                        case "varchar":
                            dbType = OleDbType.VarChar;
                            break;
                        case "decimal":
                            dbType = OleDbType.Decimal;
                            break;
                        case "int":
                            dbType = OleDbType.Integer;
                            break;
                        case "smallint":
                            dbType = OleDbType.SmallInt;
                            break;
                        case "datetime":
                            dbType = OleDbType.DBTimeStamp;
                            break;                    default:
                            dbType = OleDbType.Char;
                            break;
                    }                ole_adapter.InsertCommand.Parameters.Add("@" + col_name, dbType, length, col_name);                //.*********************************
                    //还有那么多参数你都没有添加呢
                    //********************************                //处理可空的字段
                    if (status == 8)
                    {
                        ole_adapter.InsertCommand.Parameters["@" + col_name].IsNullable = true;
                    }
                }
                reader.Close();
      

  33.   

    你看你添加了这么多的占位符:for (int i = 1; i <= col_num; i++)
                            {
                                sInsert += "?,";
                            }所以你也要添加这么多的参数,并且还要给这些参数值啊..
      

  34.   

    对了数据库是sybase的,原理是从系统表取出该表的字段信息,循环赋值
      

  35.   

    我没怎么用过sybase..我以Oracle的OleDb方式举个例子吗:比如说我向一个student表中添加一条记录,而表中有sno,sname,sage三个字段:OleDbCommand cmd=new OleDbCommand("insert into student values(?,?,?)",con);
    cmd.Parameters.AddWithValue("@Sno",this.TextBox1.Text.Trim());
    cmd.Parameters.AddWithValue("@Sname",this.TextBox2.Text.Trim());
    cmd.Parameters.AddWithValue("@Sage",Convert.ToInt32(this.TextBox3.Text.Trim());
    //插入操作
    cmd.ExecuteNonQuery();以上是添加了三个参数,并且注意添加的顺序也要和数据库中的一致..
      

  36.   

    我用的adapter.update,?和参数个数肯定是相等的
      

  37.   

    你前面用的是: //生成adapter
                ole_adapter.InsertCommand = new OleDbCommand(sInsert, Conn_S);后面添加参数时:ole_adapter.InsertCommand.Parameters.Add("@" + col_name, dbType, length, col_name);
                    //处理可空的字段
                    if (status == 8)
                    {
                        ole_adapter.InsertCommand.Parameters["@" + col_name].IsNullable = true;
                    }就两个参数吗?
    还有参数是在哪添加的?
      

  38.   

    select = "select name ,(select name from systypes where usertype = syscolumns.usertype) as typename ,length,status from syscolumns where id = (select id from sysobjects where  name = '" + sTableName + "')";
                command = new OleDbCommand(select, Conn_S);
                reader = command.ExecuteReader();
                while (reader.Read())
                {这段是通过系统表取每个字段信息,然后加到参数里。
      

  39.   

    有没有xml导入数据库的相关源码?我学习一下
      

  40.   

    以string方式将xml传给sql server的存储过程,以OPENXML方式直接操作xml文档信息,对应到数据库表的字段,在入库,在sqlserver的连机帮助中openxml项有详细的说明,包括查询,插入的例子
      

  41.   

    教你个好办法,用ado.net好好的看看,我想现在没有比这个更好的了!呵呵