我用 SystemException 抓到一个异常,信息为:
“标准表达式中的数据类型不匹配”。用不用 ToString() 都是一样的,所以我估计是 OleDbType.LongVarChar,64000 这里不对,
可是又不知道应该用什么?

解决方案 »

  1.   

    string类型,最多 64,000 个字符。
      

  2.   

    varchar好象可以吧,自己再定一个长度就行了,我是这么用的
      

  3.   

    相当于sql server中的text
    OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\\poordb.mdb;");
    OleDbCommand cmd = new OleDbCommand("insert into ttt (id,memory) values (2, ?)",conn);
    string str = "hello  world";
    cmd.Parameters.Add("@memory", OleDbType.Variant, str.Length, "memory").Value = str;
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
    conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\\poordb.mdb;");
    cmd = new OleDbCommand("select * from ttt", conn);
    conn.Open();
    OleDbDataReader read = cmd.ExecuteReader();
    while(read.Read())
    {
    string strMemo = read["memory"].ToString();
    string strID = read["id"].ToString();
    }
    read.Close();
    conn.Close();
      

  4.   

    如果是字符串, 直接先取字符串的长度即可类型OleDbType.Variant也行的
      

  5.   

    已经改成了
    OleDbParameter prmRefno = new OleDbParameter("@refno",OleDbType.Variant,
    strRefno.Length,ParameterDirection.Input,
    true,0,0,null,DataRowVersion.Current,strRefno.ToString());
    cmdInsert.Parameters.Add(prmRefno);
    一样的报错!
      

  6.   

    用string,把全部的程序贴上来?把错误抓处来,贴上来。
      

  7.   

    这里有对于关系:http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q320/4/35.asp&NoWebContent=1
      

  8.   

    你少加几个参数试试cmdInsert.Parameters.Add("@refno", OleDbType.Variant, strRefno.Length, "refno").Value = strRefno.ToString();
      

  9.   

    多谢几位大哥的帮忙! 问题已经解决,不过,错误不在这里。用 OleDbType.LongVarChar是可以的, OleDbType.Variant应该也行吧, 错误其实不在这里。 我的这段程序功能是要实现同时保存图片和几个文本字段到 access 数据库, 我最后调试的结果是: 在写 insert 语句的时候, 图片字段必须写在第一个!
    如果写在其他任何位置,都会出现 “标准表达式中的数据类型不匹配”这个错误!这是我反复尝试无意发现的,我不知道为什么一定要写在第一个参数? 谁能给个解释?下面是我调试成功的代码片断:// 这段代码的功能是同时将图片和文本字段保存到 access 数据库。// 构成文件名
    imagePath = folderPath + "\\" + dr["sdno"].ToString() + ".jpg";// 用变量保存原数据库字段的值
    strSdno = dr["sdno"].ToString();
    strDscp = dr["dscp"].ToString();
    strPartno = dr["partno"].ToString();
    strRefno = dr["refno"].ToString();
    strApplication = dr["application"].ToString();OleDbCommand cmdInsert;// 若相应的图片文件存在,则连同此图片存入新的数据库
    if(File.Exists(imagePath))
    {
    cmdInsert = new OleDbCommand("insert into product "
    + "(photo,sdno,dscp,partno,application,refno) "
    + "values (@photo,@sdno,@dscp,@partno,@application,@refno)",conn2); // 读取图片信息
    FileStream fs = new FileStream(imagePath,FileMode.Open,FileAccess.Read);
    byte[] bytData = new byte[fs.Length - 1];
    fs.Read(bytData,0,bytData.Length);
    fs.Close(); // photo
    OleDbParameter prmPhoto = new OleDbParameter("@photo",OleDbType.LongVarBinary,
    bytData.Length,ParameterDirection.Input,true,
    0,0,null,DataRowVersion.Current,bytData);
    cmdInsert.Parameters.Add(prmPhoto);
    }
    else
    {
    cmdInsert = new OleDbCommand("insert into product "
    + "(sdno,dscp,partno,application,refno) "
    + "values (@sdno,@dscp,@partno,@application,@refno)",conn2);
    }// sdno
    cmdInsert.Parameters.Add("@sdno", OleDbType.VarChar, 
    24, "sdno").Value = strSdno.ToString();
    // dscp
    cmdInsert.Parameters.Add("@dscp", OleDbType.VarChar, 
    36, "dscp").Value = strDscp.ToString();
    // partno
    cmdInsert.Parameters.Add("@partno", OleDbType.VarChar, 
    24, "partno").Value = strPartno.ToString();
    // refno "备注" 型,长度 64000
    cmdInsert.Parameters.Add("@refno", OleDbType.LongVarChar, 
    strRefno.Length, "refno").Value = strRefno.ToString();
    // application "备注" 型,长度 64000
    cmdInsert.Parameters.Add("@application", OleDbType.LongVarChar, 
    strRefno.Length, "application").Value = strApplication.ToString();// 执行插入命令
    cmdInsert.ExecuteNonQuery();
      

  10.   

    请 班门斧,快乐王子 到这里接分,再次感谢你们的无私帮助!
    http://expert.csdn.net/Expert/topic/2139/2139532.xml?temp=.9971735小弟原先一直在 asp 版混,现决定长期进驻 c# 版,还请各位大哥多多指教!