OLEDB访问数据库问题

用VS编程,部署在win2019上,后端oracle19C,调试时发现用传参的方式编写SQL,无法获取数据结果(SQL语句是正确的,在PLSQL中测试过,应该返回1,实际部署后发现传参模式返回0)如下图。

img

用纯SQL查询,发现可以获取结果,如下图

img

感谢

在正常机器上测试这段代码的两种oledb传参方式


//string sql = "select count(*) from user where name = ?";或者            
string sql = "select count(*) from user where name = :name";            
OleDbConnection con = new OleDbConnection(constring);
            con.Open();
            OleDbCommand com = new OleDbCommand(sql, con);
  //          com.Parameters.AddWithValue("@name", "HANZD");
            com.Parameters.AddWithValue("name", "HANZD");

,都是没有问题的,现在服务器上运行失败,且服务器曾经蓝屏错误重启,应判断是非正常情况导致文件错误导致oledb提交数据库的过程中出现非正常问题。解决方案:
1、换正常的服务器即可;
2、如果必须解决目前这台不正常的服务器,还是需要从蓝屏原因和导致的文件损坏上找问题。

1、更换驱动包版本
2、换成字符串拼接方式

OleDbXXX这个只能访问Access,Oracle需要另外的类,Oracle官网有下载

俺来学习一下, 这个不会

可能有几个可能的原因需要检查和排除:

参数传递错误:请确保在传递参数时使用了正确的参数名和参数值,并且与数据库中的列名和数据类型匹配。检查传递参数的代码和参数绑定的方式,确保参数被正确绑定到 SQL 查询中。

参数类型不匹配:检查传递的参数类型与数据库中列的数据类型是否一致。如果参数类型与数据库列的数据类型不匹配,可能导致查询结果为空或不正确。

数据库连接配置:检查连接到 Oracle 数据库的连接字符串和配置。确保连接字符串中包含正确的数据库名称、用户名和密码,并且具有访问所需表和数据的权限。

数据库权限:确保连接到 Oracle 数据库的用户具有执行所需查询的权限。如果权限不足,可能导致查询结果为空或不正确。

数据库表或列名称错误:检查 SQL 查询中的表名和列名是否正确。确保表名和列名与实际数据库中的名称完全一致,包括大小写。

数据库数据问题:检查数据库中的数据是否符合预期。可能存在数据不完整、数据不准确或其他数据问题,导致查询结果不符合预期。

日志和错误信息:查看应用程序和数据库的日志文件,以及任何报错信息或异常信息。这些日志和错误信息可能提供有关问题的更多详细信息,帮助您定位和解决问题。

你跟一下断点看查询的参数传的是什么,这个环境会不会传的参数不对

数据类型不匹配:确保在传递参数时使用正确的数据类型。例如,如果参数是字符串,则必须将其传递为字符串,而不是整数或其他数据类型。

参数名称不正确:确保传递参数时使用正确的参数名称。如果参数名称与存储过程或函数定义中的名称不匹配,则可能无法正确传递参数。

我的建议是:不要直接使用OLEDB访问Oracle,改用ODP.NET或Dapper这样的框架,OLEDB对参数化查询支持不太友好,是人家附带的

C#通过oledb访问access数据库的方法

// OleDbSample.cs
// 若要从命令行生成此示例,请使用命令:
// csc oledbsample.cs
using System;
using System.Data;
using System.Data.OleDb;
using System.Xml.Serialization;
public class MainClass 
{
 public static void Main ()
 {
  // 设置访问连接并选择字符串。
  // 如果从命令行生成此示例,
  // 则必须更改 BugTypes.MDB 的路径:
#if USINGPROJECTSYSTEM
  string strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\..\\BugTypes.MDB";
#else
  string strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BugTypes.MDB";
#endif
  string strAccessSelect = "SELECT * FROM Categories";
  // 创建数据集并向其中添加 Categories 表:
  DataSet myDataSet = new DataSet();
  OleDbConnection myAccessConn = null;
  try
  {
   myAccessConn = new OleDbConnection(strAccessConn);
  }
  catch(Exception ex)
  {
   Console.WriteLine("Error: Failed to create a database connection. \n{0}", ex.Message);
   return;
  }
  try
  {
   OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect,myAccessConn);
   OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);
   myAccessConn.Open();
   myDataAdapter.Fill(myDataSet,"Categories");
  }
  catch (Exception ex)
  {
   Console.WriteLine("Error: Failed to retrieve the required data from the DataBase.\n{0}", ex.Message);
   return;
  }
  finally
  {
   myAccessConn.Close();
  }
  // 一个数据集可以包含多个表,因此可以将这些表都放入
  // 一个数组中:
  DataTableCollection dta = myDataSet.Tables;
  foreach (DataTable dt in dta)
  {
   Console.WriteLine("Found data table {0}", dt.TableName);
  }
  // 下面两行显示两种不同方法,可用于获取数据集中
  // 的表计数:
  Console.WriteLine("{0} tables in data set", myDataSet.Tables.Count);
  Console.WriteLine("{0} tables in data set", dta.Count);
  // 下面几行显示如何按名称
  // 从数据集中获取特定表的信息:
  Console.WriteLine("{0} rows in Categories table", myDataSet.Tables["Categories"].Rows.Count);
  // 列信息自动从数据库中提取,因此
  // 可以在此处看到这些信息:
  Console.WriteLine("{0} columns in Categories table", myDataSet.Tables["Categories"].Columns.Count);
  DataColumnCollection drc = myDataSet.Tables["Categories"].Columns;
  int i = 0;
  foreach (DataColumn dc in drc)
  {
   // 打印列下标,然后打印列的名称及其
   // 数据类型:
   Console.WriteLine("Column name[{0}] is {1}, of type {2}",i++ , dc.ColumnName, dc.DataType);
  }
  DataRowCollection dra = myDataSet.Tables["Categories"].Rows;
  foreach (DataRow dr in dra)
  {
   // 打印 CategoryID 作为下标,然后打印 CategoryName:
   Console.WriteLine("CategoryName[{0}] is {1}", dr[0], dr[1]);
  }
 }
}

安装什么数据库呢?