AccessHelper.cs

本文提供了一个.NET框架下操作Access数据库的实用类库示例,包括连接数据库、执行SQL语句及数据填充等功能。通过该类库,开发者能够方便地进行数据库连接状态检查、执行SQL命令并获取结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Data;
using System.Data.OleDb;

namespace AccessDAL
{
    /// <summary>
    /// AccessHelper 的摘要说明。
    /// </summary>
    public class AccessHelper
    {
        private AccessHelper()
        {
            //静态构造函数,表示该类不可以被实例化
            //所以的成员都是static类型的
        }
        //<connectionStrings>
  //   <add name="AccessConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/azhou/data/szdsdz.mdb"  
        //        providerName="System.Data.OleDb" />
     //</connectionStrings>
        private static string m_connection = System.Configuration.ConfigurationManager.ConnectionStrings["AccessConnectionString"].ConnectionString;
        /// <summary>
        /// ConnectionString的属性
        /// </summary>
        public static string ConnectionString
        {
            set{ m_connection = value;}
            get{ return m_connection;}
        }

        /// <summary>
        /// 判断OleDbConnection是否已经连接
        /// </summary>
        /// <returns>true 表示OleDbConnection已经连接,或者设置连接成功;
        /// false 表示OleDbConnection尝试连接失败</returns>
        public static string IsConnected()
        {
            OleDbConnection conn = new OleDbConnection(m_connection);
           
            try
            {
                conn.Open();
                return "<div style=/"color:#ff0000;/">连接成功!</div>";
            }
            catch()
            {
                return "<div style=/"color:#ff0000;/">连接失败!</div>"; //return ex.ToString();//调试的时候用
            }
        }

        /// <summary>
        /// 测试能否连接(打开并关闭)
        /// </summary>
        /// <returns></returns>
        public static string IsCanConnected()
        {
            OleDbConnection conn = new OleDbConnection(m_connection);
            string result = "false";
            try
            {
                conn.Open();
                result = "<div style=/"color:#ff0000;/">成功打开数据库!并且成功关闭数据库!</div>";
            }
            catch
            {
                result = "<div style=/"color:#ff0000;/">连接失败!</div>";
            }
            finally
            {
                conn.Close();
            }
            return result;
        }

        /// <summary>
        /// 执行一条Sql命令
        /// </summary>
        /// <param name="cmdText">Sql语句</param>
        /// <returns>表示影响的行数</returns>
        public static int ExecuteText(string cmdText)
        {
            OleDbCommand cmd = new OleDbCommand();
            try
            {
                PrepareCommand(cmd,CommandType.Text,cmdText);
                try
                {
                    return cmd.ExecuteNonQuery();
                }

                catch (OleDbException e)
                {
                    throw (new Exception(e.Message));;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCmd(cmd);
            }
        }

        /// <summary>
        /// 执行一条Sql命令(ExecuteScalar),返回一个结果值(int, string, float等类型)。如果不存在记录,返回为null。
        /// </summary>
        /// <param name="cmdText">Sql语句</param>
        /// <returns>返回值(int, string, float等类型)。如果不存在记录,返回为null。</returns>
        public static object ExecuteTextRet(string cmdText)
        {
            OleDbCommand cmd = new OleDbCommand();
            try
            {
                PrepareCommand(cmd, CommandType.Text, cmdText);
                try
                {
                    return cmd.ExecuteScalar();
                }
                catch (OleDbException e)
                {
                    throw (new Exception(e.Message));
                }
            }           
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCmd(cmd);
            }
        }

        /// <summary>
        /// 执行一个Sql命令,返回一个DataSet结果集。
        /// </summary>
        /// <param name="cmdText">Sql语句</param>
        /// <param name="TableName">Fill入DataSet中的表名</param>
        /// <returns>DataSet结果集</returns>
        public static DataSet ExecuteTextRet(string cmdText, string TableName)
        {
            DataSet ds = new DataSet();
            OleDbDataAdapter adp = new OleDbDataAdapter();
            OleDbCommand cmd = new OleDbCommand();
            try
            {
                PrepareCommand(cmd, CommandType.Text, cmdText);
                try
                {
                    adp.SelectCommand = cmd;
                    adp.Fill(ds,TableName);
                    return ds;
                }
                catch (OleDbException e)
                {
                    throw (new Exception(e.Message));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCmd(cmd);
            }

        }   

        /// <summary>
        /// 把一个DataSet更新入数据库(可以修改,添加,删除)
        /// 但是,这个表的设计中必须要有主键
        /// </summary>
        /// <param name="cmdText">select语句,和要更新的表对应</param>
        /// <param name="ds">要更新入数据库的DataSet</param>
        /// <param name="TableName">DataSet中的源表名</param>
        /// <returns>影响的行数</returns>
        public static int ExecuteUpdate(string cmdText,DataSet ds,string TableName)
        {
            OleDbDataAdapter adp = new OleDbDataAdapter();
            OleDbCommand cmd = new OleDbCommand();
            try
            {
                PrepareCommand(cmd, CommandType.Text, cmdText);
                adp.SelectCommand = cmd;
                OleDbCommandBuilder builder = new OleDbCommandBuilder(adp);
                return adp.Update(ds,TableName);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCmd(cmd);
                adp.Dispose();
            }
        }

        /// <summary>
        /// 设置OleDbCommand的参数
        /// </summary>
        /// <param name="cmd">OleDbCommand对象</param>
        /// <param name="cmdType">类型</param>
        /// <param name="cmdText">Sql语句</param>       
        private static void PrepareCommand(OleDbCommand cmd, CommandType cmdType, string cmdText)
        {   
            OleDbConnection    conn = new OleDbConnection(m_connection);
            try
            {
                conn.Open();
   
                if (cmd != null)
                {
                    cmd.Connection = conn;
                    cmd.CommandText = cmdText;
                    cmd.CommandType = cmdType;
                }               
            }

            catch (OleDbException e)
            {
                throw (new Exception(e.Message));
            }
        }
       

        /// <summary>
        /// 处理OleDbCommand,关闭连接,并且释放内存。
        /// </summary>
        /// <param name="cmd">要处理的OleDbCommand对象</param>
        private static void DisposeCmd(OleDbCommand cmd)
        {
            if (cmd.Connection != null)
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
            }
            cmd.Dispose();
        }

        #region 填加段
        /// <summary>
        /// 根据app.config获取连接字符串
        /// </summary>
        /// <returns></returns>
        public static string GetConnectionStringFromConfigFile()
        {
            DataSet ds = new DataSet();
            ds.ReadXml(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);           
            string result = ds.Tables["appSettings"].Rows[0]["DateSource"].ToString();
            ds.Clear();
            ds.Dispose();

            result = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + result;       
            return result;
        }

        /// <summary>
        /// 根据app.config获取数据源的信息
        /// </summary>
        /// <returns></returns>
        public static string GetDataSourceFromConfigFile()
        {
            DataSet ds = new DataSet();
            ds.ReadXml(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);           
            string result = ds.Tables["appSettings"].Rows[0]["DateSource"].ToString();
            ds.Clear();
            ds.Dispose();
           
            return result;

        }

        /// <summary>
        /// 设置app.config的数据源信息
        /// </summary>
        /// <param name="dataSource"></param>
        public static void SetDataSourceToConfigFile(string dataSource)
        {
            DataSet ds = new DataSet();
            ds.ReadXml(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);           
            ds.Tables["appSettings"].Rows[0]["DateSource"]=dataSource;
            ds.AcceptChanges();
            ds.WriteXml(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
            ds.Clear();
            ds.Dispose();
        }
        #endregion
    }
}
 

System.ArgumentNullException: Value cannot be null. Parameter name: field at Beisen.Common.HelperObjects.ArgumentHelper.AssertNotEmpty(String value, String paramName) in f:\MSBuildWorkSpace\dll.Beisen.Common.Release\HelperObjects\ArgumentHelper.cs:line 126 at Beisen.SearchV3.DSL.Filters.TermsFilter.Validate(QueryContext context) at Beisen.SearchV3.DSL.BaseFilter.Rewrite(QueryContext context) at Beisen.SearchV3.Util.ElasticHelper.Rewrite(IList`1 filters, QueryContext context) at Beisen.SearchV3.DSL.Filters.BooleanFilter.Rewrite(QueryContext context) at Beisen.SearchV3.Util.ElasticHelper.Rewrite(IList`1 filters, QueryContext context) at Beisen.SearchV3.DSL.ElasticQuery.Rewrite(QueryContext context) at Beisen.SearchV3.Commands.SearchCommand.CreateRestRequest() at Beisen.SearchV3.Commands.Command`1.ToRestRequest() at Beisen.SearchV3.Providers.ElasticSearchRestClient.<>c__DisplayClass2_0.<Search>b__0(TraceSession traceSession) at Beisen.Infrastructure.Trace.TraceLogHelper.Trace[T](Func`2 func, String name) at Beisen.Steppe.Index.SteppeIndexRetry.<>c__DisplayClass6_0.<Search>b__0() at Beisen.Steppe.Helper.RetryHelper.Execute(Action action, Stopwatch watch) at Beisen.Steppe.Index.SteppeIndexRetry.Search(DatabaseMetadata databaseMetadata, TableMetadata tableMetadata, Int32 tenantId, SearchRequest searchRequest, Stopwatch watch) at Beisen.Steppe.SteppeDatabase.Search(Guid tableId, Int32 tenantId, SearchRequest searchRequest) at Beisen.MultiTenant.DataAccess.WrapperBridgeV2.GetEntityIdListByScrollV2(MetaObject metaObject, IFilter filter, IQuery query, Dictionary`2 sortFields, String scrollId, Int32 scrollSearchSize, Int32 scrollReturnSize) in E:\JenkinsAgent\workspace\MultiTenantV7.BizData.ESB\Library\Beisen.MultiTenant.BizData.Services\DataAccess\WrapperBridge\WrapperBridgeV2.cs:line 1751
最新发布
03-26
<think>好的,我现在需要帮助用户解决在Beisen框架中使用TermsFilter的Validate方法时遇到的System.ArgumentNullException异常,参数名为'field'的问题。首先,我需要理解这个错误的具体原因和上下文。 根据用户提供的引用内容,ArgumentNullException通常是因为某个参数为null,而方法不允许它为空。例如,引用[1]到[5]中提到的类似错误,都是由于参数如styleSheet、shader等未正确设置导致的。用户的问题出现在Beisen.Common.HelperObjects.ArgumentHelper.AssertNotEmpty方法中,调用TermsFilter的Validate时,参数'field'为空。 首先,我应该考虑参数传递是否正确。可能是在调用Validate方法时,没有正确传入field参数,或者该参数在传递过程中被意外置为null。需要检查调用Validate方法的代码,确认所有必需的参数都被正确赋值,特别是与field相关的参数。 其次,可能需要检查TermsFilter的初始化过程。如果在创建TermsFilter实例时,某些必需的字段未被正确初始化,比如field属性未被赋值,那么在调用Validate方法时就会触发AssertNotEmpty的检查,导致异常。用户需要确保在构造TermsFilter对象时,所有必要字段都已正确设置,尤其是field属性。 另外,引用[4]提到在Unity中某些情况下,修改预制体后未正确选择物体可能导致序列化问题,虽然这里的环境不同,但可能存在类似的初始化或序列化问题。需要确认在Beisen框架中是否有类似的序列化或初始化步骤被遗漏,导致field参数未被正确赋值。 此外,引用[5]提到缺少Shader时,通过项目设置添加缺失的资源。类似地,可能需要检查Beisen框架中是否有相关的配置或资源文件缺失,导致field参数无法正确获取。例如,某些配置文件中的字段名是否正确,或者数据库查询中的字段是否存在。 可能还需要检查ElasticQuery的重写逻辑(Rewrite),确保在构建查询时,field参数被正确传递和处理。如果Rewrite过程中修改或删除了某些字段,可能导致后续Validate时参数为空。 总结可能的解决方案步骤: 1. 检查调用Validate方法时的参数传递,确保field不为null。 2. 确保TermsFilter实例化时field属性被正确初始化。 3. 检查配置文件和资源,确认相关字段存在且正确。 4. 审查ElasticQuery的重写逻辑,确保没有错误修改field参数。 5. 添加空值检查和处理,避免异常发生。 接下来需要将这些步骤详细化,并给出具体的代码示例和检查点,帮助用户逐步排查问题。</think>### 解决方案:解决 `System.ArgumentNullException` 在 `TermsFilter.Validate` 中的 "field" 参数为空问题 #### 1. 定位异常触发点 根据描述,异常发生在 `Beisen.Common.HelperObjects.ArgumentHelper.AssertNotEmpty` 方法中,调用链路为 `TermsFilter.Validate` → `ElasticQuery` 查询逻辑。 **直接原因**:传递给 `Validate` 方法的 `field` 参数为 `null`,但 `ArgumentHelper.AssertNotEmpty` 要求该参数非空[^1][^2]。 --- #### 2. 分步排查与修复 ##### 2.1 检查 `TermsFilter` 初始化代码 确保在创建 `TermsFilter` 实例时,`field` 属性已被正确赋值: ```csharp var filter = new TermsFilter { Field = "your_field_name", // 必须明确赋值 Values = new List<string> { "value1", "value2" } }; ``` **常见问题**: - 字段名拼写错误(如大小写敏感)。 - 从配置或数据库中动态获取 `field` 值时未处理空值情况。 --- ##### 2.2 验证 `ElasticQuery` 的 `Rewrite` 逻辑 如果 `ElasticQuery` 在重写过程中修改了 `field` 参数,需检查以下逻辑: ```csharp public override void Rewrite() { // 确保重写逻辑未清除或覆盖 field 值 if (string.IsNullOrEmpty(base.Field)) { throw new ConfigurationException("Field 未正确配置"); } base.Rewrite(); } ``` --- ##### 2.3 添加空值防御性编程 在调用 `Validate` 方法前手动检查 `field` 参数: ```csharp if (string.IsNullOrEmpty(filter.Field)) { // 记录日志或抛出更明确的异常 logger.Error("TermsFilter.Field 未赋值"); throw new ArgumentNullException(nameof(filter.Field)); } filter.Validate(); ``` --- ##### 2.4 检查框架或依赖配置 参考类似问题的解决方式(如 Unity 中缺少 Shader 导致空参数异常[^5]),检查: 1. Beisen 框架的配置文件(如 `appsettings.json`)中是否定义了 `field` 的默认值。 2. 数据库或外部服务返回的字段名是否与 `TermsFilter` 预期匹配。 --- ##### 2.5 调试与日志追踪 在 `ArgumentHelper.AssertNotEmpty` 方法中添加详细日志,输出调用堆栈和参数值: ```csharp public static void AssertNotEmpty(string value, string paramName) { if (string.IsNullOrEmpty(value)) { // 记录异常上下文 Logger.Error($"参数 {paramName} 为空,调用堆栈:{Environment.StackTrace}"); throw new ArgumentNullException(paramName); } } ``` --- #### 3. 根本原因总结 | 可能原因 | 验证方法 | 解决方案 | |---------|----------|----------| | `field` 未初始化 | 检查 `TermsFilter` 构造函数 | 显式赋值或配置默认值 | | 查询重写逻辑错误 | 调试 `ElasticQuery.Rewrite` | 修复字段处理逻辑 | | 动态值来源异常 | 检查数据库/API 返回数据 | 添加空值校验和回退机制 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值