用VS编程,部署在win2019上,后端oracle19C,调试时发现用传参的方式编写SQL,无法获取数据结果(SQL语句是正确的,在PLSQL中测试过,应该返回1,实际部署后发现传参模式返回0)如下图。
用纯SQL查询,发现可以获取结果,如下图
感谢
在正常机器上测试这段代码的两种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]);
}
}
}
安装什么数据库呢?