C#插入数据到VF中,出现数据类型不对的错误。。

viki117 2008-12-12 02:46:01

OdbcConnection odbcConn = new OdbcConnection(strOdbcConn);
string strSQL = "select top 1 * from order order by dono";
OdbcDataAdapter odbcDA = new OdbcDataAdapter(strSQL, odbcConn);
OdbcCommandBuilder builder = new OdbcCommandBuilder(odbcDA);
odbcDA.InsertCommand = builder.GetInsertCommand();
odbcDA.Update(ds, "Order");

然后出现错误。。在给ds赋值的时候是没有出错的。。

DataSet2 ds = new DataSet2();
DataRow dr = ds.Tables["Order"].NewRow();
dr["dono"] = "999999999";
dr["cuno"] = "CF";
dr["cuorno"] = "CF0001";
dr["cupdno"] = "CF_X001";
dr["mcbomno"] = "YH_Test_001";
dr["dollno"] = "1";
dr["price"] = (Decimal)99.99;
dr["term"] = "No Pay No Matter";
dr["vol"] = (Decimal)1000;
dr["totm"] = (Decimal)9999.00;
dr["outvol"] = (Decimal)0;
dr["bavol"] = (Decimal)0;
dr["nopy"] = (Decimal)999;
dr["mono"] = "No Mono to Say";
dr["orday"] = DateTime.Now;
dr["pyday"] = DateTime.Now.AddDays(10);
dr["dqno"] = "US";
dr["puchday"] = DateTime.Now;
dr["puchname"] = "WJC";
dr["modiday"] = DateTime.Parse("1900-01-01");
dr["modiname"] = "";
dr["outaddress"] = "Bright";
dr["yesno"] = false;
dr["fw"] = false;
dr["fprice"] = (Decimal)0.00;
dr["mkcuno"] = "yhbr";
dr["type"] = 1;
dr["cbprice"] = (Decimal)11.11;
dr["cbdollno"] = "1";
dr["ywno"] = "";
dr["partno"] = "";
dr["amark"] = "";
dr["bmark"] = "";
dr["cmark"] = "";
ds.Tables["Order"].Rows.Add(dr);

错误如下:
ERROR [22018] [Microsoft][ODBC Visual FoxPro Driver]Data type mismatch
...全文
343 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
viki117 2008-12-22
  • 打赏
  • 举报
回复
多个方法也好。。多个选择。。
viki117 2008-12-19
  • 打赏
  • 举报
回复

OdbcConnection odbcConn = new OdbcConnection(strOdbcConn);
string strSQL = "select top 1 * from Order order by dono";
OdbcDataAdapter odbcDA = new OdbcDataAdapter(strSQL, odbcConn);
//OdbcCommandBuilder builder = new OdbcCommandBuilder(odbcDA);
//odbcDA.InsertCommand = builder.GetInsertCommand();
//odbcDA.Update(ds, "Order");


string sqlorder = "INSERT INTO Order (dono, cuno, cuorno, cupdno, mcbomno, dollno, price, term, vol, totm, outvol, bavol, nopy," +
" mono, orday, pyday, dqno, puchday, puchname, modiday, modiname, ywno, partno, outaddress, yesno, amark, bmark, cmark, fw," +
" fprice, mkcuno, type, cbprice, cbdollno) VALUES " +
"(?, ?, ?, ?, ?, ?, " +
((decimal)ds.Order.Rows[0]["price"]).ToString("0.0000") + ", ?," +
((decimal)ds.Order.Rows[0]["vol"]).ToString("0") + ", " +
((decimal)ds.Order.Rows[0]["totm"]).ToString("0.00") + ", " +
((decimal)ds.Order.Rows[0]["outvol"]).ToString("0") + ", " +
((decimal)ds.Order.Rows[0]["bavol"]).ToString("0") + ", " +
((decimal)ds.Order.Rows[0]["nopy"]).ToString("0") + ", ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " +
((decimal)ds.Order.Rows[0]["fprice"]).ToString("0.0000") + ", ?, ?, " +
((decimal)ds.Order.Rows[0]["cbprice"]).ToString("0.0000") + ", ?)";

odbcDA.InsertCommand = new OdbcCommand(sqlorder, odbcConn);

for (int i = 0; i < ds.Order.Columns.Count; i++)
{
OdbcType mytype = new OdbcType();
if (ds.Order.Columns[i].DataType != typeof(decimal))
{
if (ds.Order.Columns[i].DataType == typeof(string))
{
mytype = System.Data.Odbc.OdbcType.NVarChar;
}
if (ds.Order.Columns[i].DataType == typeof(global::System.DateTime))
{
mytype = System.Data.Odbc.OdbcType.Date;
}
if (ds.Order.Columns[i].DataType == typeof(bool))
{
mytype = System.Data.Odbc.OdbcType.Bit;
}
OdbcParameter para;
para = odbcDA.InsertCommand.Parameters.Add(new OdbcParameter("@" + ds.Order.Columns[i].ColumnName, mytype));
para.SourceColumn = ds.Order.Columns[i].ColumnName;
}
}

odbcDA.Update(ds, "Order");
viki117 2008-12-19
  • 打赏
  • 举报
回复
终于勉强找到解决办法了。。既不字符类字段的注入类错误。。也解决了数字类字段的插入。。
用参数结合SQL语句来执行。。
我这个循环还没有完全做完。。数字类型的是我自己写上的。。大家可以根据需求自己改。。
不过这种方法就是每次只能执行一条记录。。非常的不方便啊
特别 2008-12-19
  • 打赏
  • 举报
回复
ODBC连接VFP表,更新数值型字段实在是没招了,
你上面的方法也能凑合
下面是使用OLEDB方式处理的
可能需要到http://www.microsoft.com/downloads/details.aspx?FamilyID=e1a87d8f-2d58-491f-a0fa-95a3289c5fd4&DisplayLang=en
下载VFP的OLEDB驱动
下面是我测试的表结构

表结构: D:\VFP98\TEST.DBF
数据记录数: 4
最近更新的时间: 12/19/08
代码页: 936
字段 字段名 类型 宽度 小数位 索引 排序 Nulls
1 IID 整型 4 否
2 NAME 字符型 10 否
3 ENGLISH 数值型 10 2 否
4 MATH 数值型 14 4 否
** 总计 **

下面是OLEDB的测试代码

private void button1_Click( object sender, EventArgs e )
{
OleDbConnection conn = new OleDbConnection( @"Provider=vfpoledb.1;Data Source=D:\VFP98;Collating Sequence=machine;" );
conn.Open();

OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from Test";
OleDbDataAdapter oda = new OleDbDataAdapter( cmd );
DataSet ds = new DataSet();
oda.Fill( ds, "test" );
DataTable dt = ds.Tables[0];

DataRow dr = dt.NewRow();
dr["iid"] = 1;
dr["name"] = "abc";
dr["english"] = 3.75;
dr["math"] = 1834.4483;

dt.Rows.Add( dr );

OleDbCommandBuilder ocb = new OleDbCommandBuilder( oda );
oda.InsertCommand = ocb.GetInsertCommand();

oda.Update( ds, "test" );

conn.Close();
}

viki117 2008-12-19
  • 打赏
  • 举报
回复
VFP6.0 结构如下

資料表格的資料結構: \\NT6\F$\TESTDATA\ORDER.DBF
記錄筆數: 132690
最近一次更新的時間: 01/15/08
附註檔案單位儲存大小: 64
字碼頁: 950
欄位 欄位名稱 類型 寬度 小數位數 索引 排序 Nulls
1 DONO 字元型態 9 昇冪 Machine 否
2 CUNO 字元型態 4 否
3 CUORNO 字元型態 14 昇冪 Machine 否
4 CUPDNO 字元型態 20 否
5 MCBOMNO 字元型態 14 否
6 DOLLNO 字元型態 1 否
7 PRICE 數值型態 9 4 否
8 TERM 字元型態 20 否
9 VOL 數值型態 7 否
10 TOTM 數值型態 10 2 否
11 OUTVOL 數值型態 7 否
12 BAVOL 數值型態 7 否
13 NOPY 數值型態 7 否
14 MONO 字元型態 20 否
15 ORDAY 日期型態 8 否
16 PYDAY 日期型態 8 否
17 DQNO 字元型態 2 否
18 PUCHDAY 日期型態 8 否
19 PUCHNAME 字元型態 8 否
20 MODIDAY 日期型態 8 否
21 MODINAME 字元型態 8 否
22 YWNO 字元型態 2 否
23 PARTNO 字元型態 2 否
24 OUTADDRESS 字元型態 30 否
25 YESNO 邏輯型態 1 否
26 AMARK 附註型態 4 否
27 BMARK 附註型態 4 否
28 CMARK 附註型態 4 否
29 FW 邏輯型態 1 否
30 FPRICE 數值型態 9 4 否
31 MKCUNO 字元型態 4 否
32 TYPE 字元型態 1 否
33 CBPRICE 數值型態 9 4 否
34 CBDOLLNO 字元型態 1 否
** 總計 ** 272

问题就是出在数值类型上面
特别 2008-12-18
  • 打赏
  • 举报
回复
贴一下这个VFP表的结构,还有这个创建这个VFP表的VFP版本
viki117 2008-12-18
  • 打赏
  • 举报
回复
问题其实应该很简单,主要是不知道怎么绕过去数值字段的处理
viki117 2008-12-18
  • 打赏
  • 举报
回复
如果在C#下面没有人有办法的话,就只能考虑用其他方法了。。
waltguo 2008-12-15
  • 打赏
  • 举报
回复
UP
quanhuang98bisha 2008-12-15
  • 打赏
  • 举报
回复
vf 不会 帮顶
viki117 2008-12-15
  • 打赏
  • 举报
回复
到底怎么解决VF数值类型啊。。。
viki117 2008-12-15
  • 打赏
  • 举报
回复
时间类型,我有单独测试。。没有什么问题啊
特别 2008-12-13
  • 打赏
  • 举报
回复
如果你是VF6的话,好象只有日期型,你赋值的时候不能带时间。
viki117 2008-12-13
  • 打赏
  • 举报
回复
找高手中。。。。
wangkk125 2008-12-12
  • 打赏
  • 举报
回复
up
viki117 2008-12-12
  • 打赏
  • 举报
回复
我绝对的痛恨VF。。太烂了。。
kingcsx666 2008-12-12
  • 打赏
  • 举报
回复
以前用过vf写的框架,数据库文件都是乱放的,删了都不知道
viki117 2008-12-12
  • 打赏
  • 举报
回复
应该不是日期的吧,我写S为“2008-11-01”。。但是我必须转换为DateTime类型啊。。
否则没有办法赋值啊。。
flyjimi 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 viki117 的回复:]
引用 3 楼 flyjimi 的回复:
检查VF中定义的字段的数据类型啊。
dr["orday"] = DateTime.Now;
dr["pyday"] = DateTime.Now.AddDays(10);
是日期型还是日期时间型。

鬼知道,VF6里面写的是“日期类型”,我郁闷的很。。
[/Quote]

那你传进去的是日期时间类型,会自动截取吗。
viki117 2008-12-12
  • 打赏
  • 举报
回复
有办法解决不?高手们出点注意啥。。用SQL语句也可以,只要防止不要出现“'”的时候,插入语句出错的问题。。
加载更多回复(9)

110,538

社区成员

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

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

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