首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Sybase >

odbc方式操作sybase奇怪的有关问题(急),能解决者高分重谢(另开贴给分)

2012-02-14 
odbc方式操作sybase奇怪的问题(急!),能解决者高分重谢(另开贴给分)!C#(asp.net)通过odbc方式连接数据库,连

odbc方式操作sybase奇怪的问题(急!),能解决者高分重谢(另开贴给分)!
C#(asp.net)通过odbc方式连接数据库,连接字符串connString ="Driver={SYBASE SYSTEM 11};Srvr=XX;Uid=XX;Pwd=XX;DB=XX",连接正常. 
执行查询并返回dataset的函数如下: 
public static DataSet OdbcDataSet(string sql, string connString) 
  { 
  OdbcConnection connStr = new OdbcConnection(connString); 
  if (connStr.State.ToString() == "Closed") connStr.Open();  
  OdbcDataAdapter da = new OdbcDataAdapter(sql, connStr); 
  DataSet ds = new DataSet(); 
  ds.Clear(); 
  try 
  { 
  da.Fill(ds);//(1)报错 
  } 
  catch (Exception ex) 
  { 
  da.Fill(ds);//(2)第二次执行正常 
  } 
  finally 
  { 
  da.Dispose(); 
  connStr.Close(); 
  } 
  return ds; 
  }  

每次执行到(1)位置则出错,错误提示如下: 
ERROR [HY000] [INTERSOLV][ODBC SQL Server driver][SQL Server]ct_cursor(CLOSE): user api layer: external error: This type of command cannot be batched with the command already initialized on the command structure. 
再执行(2)位置时却正常,如果用全局连接变量也是如此,刚建立连接时第一次执行查询命令时也报上面同样的错误,以后再执行任何正确语句都正常。 

有谁知道是什么原因?如何解决? 
能解决者高分重谢谢(另开帖给分),讨论皆有分!

[解决办法]
ds.Clear(); 屏蔽掉试一下。没遇到过这种问题
[解决办法]
查询内容是什么?执行其它查询也会出错?
[解决办法]
ase版本多少?与驱动程序是配套的?
[解决办法]
C#我不是太熟悉,但是我想都是面向对象的与java操作方式差不多。
下面给你一个我用java操作sybase的两种连接方式jdbc与jndi,给你提供参照。

Java code
public class DbConnection {    private static String driverName = "com.sybase.jdbc3.jdbc.SybDriver";        private static String url = "jdbc:sybase:Tds:127.0.0.1:5000/project";    private static String user = "sa";    private static String password = "";    private static String jdbcJNDI = "java:comp/env/jdbc/pro";        public DbConnection(){            }        public static Connection getConnection1() throws SQLException{        try {            Context ctx = new InitialContext();            DataSource ds = (DataSource) ctx.lookup(jdbcJNDI);            return ds.getConnection();        }        catch (Exception ex) {            ex.printStackTrace();            throw new SQLException(ex.getMessage());        }    }        public static Connection getConnection() throws SQLException{        try {            Class.forName(driverName);            return DriverManager.getConnection(url, user, password);        }         catch (Exception ex) {            ex.printStackTrace();            throw new SQLException(ex.getMessage());        }            }        public static ResultSet select(String sql) throws SQLException{        ResultSet rs = null;        Connection conn = null;        try {            conn = getConnection();            Statement stmt = conn.createStatement();            rs = stmt.executeQuery(sql);                    } catch (SQLException e) {            System.out.println("查询异常:" + e.getMessage());        }        finally{            if(conn != null){                conn.close();            }        }        return rs;    }}
[解决办法]
,刚连接每一次会那样的错:


无论间隔多长时间,第一次运行SQL语句都会出错?
[解决办法]
添加必需的列和主键信息以完成架构。有关如何将主键信息添加到 DataTable 的更多信息,请参见 FillSchema。为与用于 OLE DB 的 .NET Framework 数据提供程序一起正确运行,AddWithKey 要求本机 OLE DB 提供程序通过设置 DBPROP_UNIQUEROWS 属性获得必需的主键信息,然后通过检查 IColumnsRowset 中的 DBCOLUMN_KEYCOLUMN 确定哪些列是主键列。作为一种备选方法,用户可以在每个 DataTable 上显式设置主键约束。这将确保对与现有记录匹配的传入记录进行更新,而不是追加。当使用 AddWithKey 时,用于 SQL Server 的 .NET Framework 数据提供程序将 FOR BROWSE 子句追加到正在执行的语句。用户应该注意潜在的副作用,例如对 SET FMTONLY ON 语句的使用产生的干扰。

表没有主键?
[解决办法]
转:
原来在默认的情况下填充DataTable时并没有从数据库中取的主键的信息。如何获得主键呢?经过研究发现在填充Dataset的时候可以使用DataAdapter的MissingSchemaAction属性帮助我们解决这个问题,于是有如下的代码:
  
   //使用DataAdapter填充DataTable
   dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
   dataadapter.Fill(Table);
   DataColumn[] cols;
   cols = Table.PrimaryKey;
   //注意不是cols是DataColumn数组,不是DataColumn变量。这样做主要是为了处理联合主键的问题。
   for(int i = 0; i < cols.Length; i++)
   {
   MessageBox.Show(cols[i].ColumnName);
   }
  这样我们便可以如愿以偿了。MissingSchemaAction属性是确定现有Dataset(或DataTable)架构与传入数据不匹配时需要执行的操作。MissingSchemaAction.AddWithKey是枚举值,它的作用是添加必需的列和主键信息以完成架构,利用它用户可以在每个 DataTable上显式设置主键约束。

热点排行