如何将Xml导入数据库中

阿鹏兄 2006-12-08 03:30:14
本人是初学者,问一个简单问题。
我做一个数据导出、导入程序,用dataset将4个表导出到一个xml文件中,请问,如果通过编码将这个xml文件中的数据导入到另一个数据库中(两个库的表结构一致)!
急。
...全文
3126 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
cunjinjie 2007-01-23
  • 打赏
  • 举报
回复
教你个好办法,用ado.net好好的看看,我想现在没有比这个更好的了!呵呵
yan63 2007-01-23
  • 打赏
  • 举报
回复
以string方式将xml传给sql server的存储过程,以OPENXML方式直接操作xml文档信息,对应到数据库表的字段,在入库,在sqlserver的连机帮助中openxml项有详细的说明,包括查询,插入的例子
阿鹏兄 2007-01-23
  • 打赏
  • 举报
回复
有没有xml导入数据库的相关源码?我学习一下
worms8888 2006-12-26
  • 打赏
  • 举报
回复
mark
liujia_0421 2006-12-26
  • 打赏
  • 举报
回复
你前面用的是:

//生成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;
}

就两个参数吗?
还有参数是在哪添加的?

阿鹏兄 2006-12-26
  • 打赏
  • 举报
回复
我用的adapter.update,?和参数个数肯定是相等的
阿鹏兄 2006-12-26
  • 打赏
  • 举报
回复
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())
{

这段是通过系统表取每个字段信息,然后加到参数里。
liujia_0421 2006-12-25
  • 打赏
  • 举报
回复
我没怎么用过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();

以上是添加了三个参数,并且注意添加的顺序也要和数据库中的一致..
liujia_0421 2006-12-25
  • 打赏
  • 举报
回复
不太清楚你的表结构..

简单点说就是你加了多少个"?",就应该添加多少个参数..
阿鹏兄 2006-12-25
  • 打赏
  • 举报
回复
对了数据库是sybase的,原理是从系统表取出该表的字段信息,循环赋值
阿鹏兄 2006-12-25
  • 打赏
  • 举报
回复
还有什么参数?举个例子
我是循环增加了该表的所有字段参数!
liujia_0421 2006-12-25
  • 打赏
  • 举报
回复
你看你添加了这么多的占位符:

for (int i = 1; i <= col_num; i++)
{
sInsert += "?,";
}

所以你也要添加这么多的参数,并且还要给这些参数值啊..
liujia_0421 2006-12-25
  • 打赏
  • 举报
回复
很多问题,帮你改了部分:

但是你还有那么多参数还没有添加啊..我下面也给你标志了.

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();
liujia_0421 2006-12-25
  • 打赏
  • 举报
回复
好长..

具体在哪抛出的异常啊>>
阿鹏兄 2006-12-25
  • 打赏
  • 举报
回复
代码如下:
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;
}
liujia_0421 2006-12-25
  • 打赏
  • 举报
回复
你没有添加参数值吧..

代码?
阿鹏兄 2006-12-25
  • 打赏
  • 举报
回复
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.

如何解决?
阿鹏兄 2006-12-18
  • 打赏
  • 举报
回复
好像是Odbc.type 是decimal的问题,大家知道吗?
liujia_0421 2006-12-15
  • 打赏
  • 举报
回复
TO:sybaseASE就不行,是不是ASE odbc驱动的问题?

你这么一说,应该就是了..

呵呵.

我主要用SqlServer+Oracle,别的数据库很少用..

阿鹏兄 2006-12-15
  • 打赏
  • 举报
回复
晕呀,换成sqlserver数据库一点问题没有,sybaseASE就不行,是不是ASE odbc驱动的问题?
加载更多回复(34)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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