C# 用OLEDB 连接修改Paradox表时 提示“操作必须使用一个可更新的查询”错误? 是不是因为Paradox 带了密码的原因啊?还是字段是中文的原因?
代码:
string sql=@"Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=1FF;Data Source=C:\db;Extended Properties=Paradox 5.x";
sqlConn.ConnectionString=sql ;  
if(sqlConn.State==ConnectionState.Closed)
{
sqlConn.Open();
}
string Dvv="update 代码库 set 名称='1' where  编码 ='0001003'"
OleDbCommand myCommand = new OleDbCommand(Dvv , sqlConn);
myCommand.ExecuteNonQuery();//报错:操作必须使用一个可更新的查询
sqlConn.Close();

解决方案 »

  1.   

    用 DBView 工具查看 ,可以确定不是只读;
    写保护:OFF;
    保护:ON PASSWORD:1FF
      

  2.   

    你传进去的sql语句可能在数据库里解释为乱码,你看看编码是不是一致?
      

  3.   

    Too:我自横刀香甜笑 我如何查看是否乱码啊? 谢谢。
      

  4.   

    数据库对象名最好还是用英文吧,英文不好可以用拼音啊。就算数据库支持中文做对象名,也可能存在兼容问题,比如oleDB不兼容中文。
      

  5.   

    没有写权限,给Everyone用户写权限,就OK
      

  6.   

    绝对不是权限问题: 我看过不是只读,也具有Everyone的全部权限;还是怀疑是乱码的问题;
      

  7.   

    先看看,操作其他的表会不会出现同样的问题?如果也有的话估计是数据库读写权限的问题,设置为IIS 用户可读写试试,
      

  8.   

    是不是Paradox   数据库加了密码,   我操作其他没有带数据库密码的   没有问题   更新和删除都可以。
      

  9.   

    错误信息: Microsoft OLE DB Provider for ODBC Drivers error ''80004005'' 
    [Microsoft][ODBC Microsoft Access 97 Driver] Operation must use an 
    updateable query. 
    或者是: 
    Microsoft JET Database Engine (0x80004005) 
    操作必须使用一个可更新的查询。 原因: 
    有几个主要的错误原因: 
    这个错误发生在当你的程序试图执行更新数据库或其它类似操作时。这是因为 
    ADO由于以下的几个原因而不能够写数据库造成的。 1。一般的原因都是匿名用户帐号(IUSR_MACHINE)对该数据库文件没有写权限。 
    要解决这个问题,在管理器中调整数据库文件的属性,让匿名用户有正确的权限。 
    当使用ACCESS数据库时,不仅要给文件写的权限,还要给该目录写的权限,因为 
    Jet需要在该目录建立一个.ldb文件[NTFS硬盘格式才会出现,FAT格式的不会出现权限问题]。
    或是在IIS中设置一个有读取写入权限的匿名帐户.2。第二个原因是数据库没有使用正确的模式打开。3。还有可能是在ODBC管理器中将该DSN的只读选项选中。 4。你是在同时更新两个表中的字段,也会出现这个错误信息,解决办法是分开来更新 
    这两个表中各自字段。 5。当你使用了一个从低版本中(如ACCESS2.0,ACCESS7.0)载入到高版本(ACCESS 2000) 
    中的查询时,在执行这个查询是会出现该错误。 如果是winXP系统
    在文件夹选项里面默认使用简单共享(推荐),把这个选项去掉,
    再在文件夹上右键点击,就会出现安全这个选项卡,
    原来默认的没有,然后在安全选项卡里面可以设置用户的写入权限了
    右击数据库>安全>everyone>将需要的勾上
      

  10.   

    我这段代码测试没有问题,不过数据库没有设置密码,你对比一下,看哪里可能出现了问题。
    其中 表名:temp  ;字段类型都是 文本型。
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.OleDb;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace SUN
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {
                if (UpdateNote() == true)
                    label1.Text = "True ";
                else
                    label1.Text = "False" ;
            }        public Boolean UpdateNote()
            {
                Boolean tempvalue = false;
                string sqlstr = ""; //当时在这里定义,是为了在出现异常的时候看看我的SQL语句是否正确
                try
                {
                    //用到了我前面写的那个得到数据库连接的函数
                    OleDbConnection conn = getConn(); //getConn():得到连接对象,
                    conn.Open();                //确定我们需要执行的SQL语句,本处是UPDATE语句!
                    sqlstr = "UPDATE temp SET c1='Sun' where a1='5'";
                    //定义command对象,并执行相应的SQL语句
                    OleDbCommand myCommand = new OleDbCommand(sqlstr, conn);
                    myCommand.ExecuteNonQuery(); //执行SELECT的时候我们是用的ExecuteReader()
                    conn.Close();
                    //假如执行成功,则,返回TRUE,否则,返回FALSE
                    tempvalue = true;
                    return (tempvalue);
                }
                catch (Exception e)
                {
                    throw (new Exception("数据库更新出错:" + sqlstr + "\r" + e.Message));
                }
            }        public OleDbConnection getConn()
            {
                //string connstr = "Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=F:\\web\\notesbook\\class\\leavenotes.mdb";
                string connstr = "Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=D:\\ZWK V4.1.0001_T45M_S\\TEST\\SetParameter\\SetParameter\\bin\\Debug\\parameter.mdb";
                OleDbConnection tempconn = new OleDbConnection(connstr);
                return (tempconn);
            }    }
    }
      

  11.   

    有人说 jet驱动是不能操作paradox数据库的 只能查询,不知道是不是这样?
      

  12.   

    或者就要用bde驱动, 不知道在.net环境下如何使用bde?
      

  13.   

    微软说明如下:
    If neither Jet 4.0 SP5 or a later version nor the BDE is installed, the following are true: • Microsoft Access does not prompt for, use, or maintain Paradox indexes as in earlier versions of Microsoft Access. If Jet 4.0 SP5 or a later version or the BDE is installed, Access uses and maintains the indexes.  
    • APPEND, UPDATE, and DELETE are no longer supported. 
    • You can continue bulk writing of data to Paradox tables by using the INSERT INTO ... SELECT ... FROM ... syntax. However, the indexes are no longer maintained. 
      

  14.   

       C#   用OLEDB   连接修改Paradox表时   提示“操作必须使用一个可更新的查询”错误?   是不是因为Paradox   带了密码的原因啊?还是字段是中文的原因?
      string   sql=@"Provider=Microsoft.Jet.OLEDB.4.0;Jet   OLEDB:Database   Password=1FF;Data   Source=C:\db;Extended   Properties=Paradox   5.x";   大哥,你是用Access数据库吧??    怎么又用sqlConn.ConnectionString=sql   ;     
    if(sqlConn.State==ConnectionState.Closed) 

    sqlConn.Open(); 

       1.这里的Sql 是什么?别名?,希望是这样,  看看这里有没有错,.
       2.打开项目,数据库所在的文件夹,是权限的问题..给它权限..就行了.  给它多点权限,就行(上次我也是这样的)..
       3.Database   Password=1FF;Data   Source=C:\db  这个路径有点问题吧??  你再看看.
      

  15.   

    把C:\db这个文件夹的写入权限开出来就可以了.这个问题和ACCESS的写入权限开启是一样的。
      

  16.   

    update   [代码库]   set   [名称]='1'   where     [编码]   ='0001003'" 
      

  17.   

    现在问题是这样的: 同目录下有2个 表,一个表没有密码 可以正常更新 添加; 还有一个带密码, 可以查询 但是不能修改 删除 添加操作;
    我想应该不是目录权限问题,我给目录everyone 所以权限了;
      

  18.   

    标准答案来了用Delphi自带的Database Desktop工具打开db文件,编辑表,给某字段建立索引就可以了,会生成一个xxx.px索引文件参考如下文档,其中4里面的第二条就是了
    http://support.microsoft.com/kb/q175168/4. 最后一个问题和替代方法适用于所有 SQL 数据源。违反数据库的引用完整性的 SQL 语句可以导致出现此错误。下面是一些最常见的失败的查询:
    • 其中最简单的一组查询是以下您无法更改的查询:UniqueValue 属性设置为 Yes 的交叉表查询、SQL 传递查询、联合查询或更新(即生成表)操作查询。 
    • 另一种非常常见的原因是联接包含的链接 ODBC 表的索引不是唯一的。在这种情况下,SQL 无法保证表中的记录是唯一,该表中字段的值将随查询发生更改。 
    • 有一种原因确实有可靠的替代方法。如果您尝试更新“一对多”查询的“一”方的联接字段,操作将会失败,除非您启用级联更新。因为这样您就可以将引用完整性委托给 JET 引擎。 
     参考代码string ConnectionString = @"Driver={Microsoft Paradox Driver (*.db )};DriverID=538;Fil=Paradox 5.X;DefaultDir=C:\Paradox;Dbq=C:\Paradox;CollatingSequence=ASCII;PWD=;";
                using (System.Data.Odbc.OdbcConnection conn = new System.Data.Odbc.OdbcConnection(ConnectionString))
                {
                    conn.Open();
                    using (System.Data.Odbc.OdbcCommand command = conn.CreateCommand())
                    {
                        command.CommandText = " update test set aa=14";
                        command.ExecuteNonQuery();
                      
                        command.CommandText = "select * from test";
                        Console.WriteLine(command.ExecuteScalar());
                    }
                }
      

  19.   

    现在我这个数据库db文件目录中已经有 px文件存在 已经有索引了;还是提示操作必须使用一个可更新的查询。我快晕倒了
      

  20.   

    现在已经找到问题所在了,就是因为数据库有密码, 我把数据库密码清空后,更新1000条数据2秒结束,加上密码又是一条的操作不了。 
    看来要么是我连接数据库字符串问题,或者就是paradox数据库的结构的问题了。 麻烦大家再给我看看我的字符串连接语句。string sql=@"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Jet OLEDB:Database Password=1F;Data Source=C:\db\;Mode=ReadWrite;Extended Properties=Paradox 7.x";