首页 > 数据库 >c# 创建Access数据库文件,并创建表,增加一行数据

c# 创建Access数据库文件,并创建表,增加一行数据

时间:2024-12-11 16:43:11浏览次数:3  
标签:LogHelper string c# 创建 catalog Access ADOX new null

需求:每隔一段时间存一条数据到Access数据库,数据库文件以日期命名,把这个功能封装以供调用

分解任务:1新建数据库文件   2新建数据库表  3向数据库表中增加数据   4需要有日志记录执行结果   5由于过多的dll不易于传播维护,需要将这些dll封装

参考资料:

关闭ADOX.Catalog创建Access的链接,避免ldb锁定-CSDN博客

 

我们在动态创建ACCESS数据库的时候,往往知道如何去创建,但是对于创建后的销毁资源做的不太好,会出现.ldb锁定文件。有时候会影响到我们对数据库的操作。   首先加两个COM组件引用: 1) Microsoft ActiveX Data Objects 2.8 Library 2) Microsoft ADO Ext. 2.8 for DDL and Security   创建数据库: ADOX. CatalogClass catalog = new ADOX. CatalogClass(); string str = "Provider=Microsoft.Jet.OleDB.4.0"; str += ";Data Source="+ file; // Your *.mdb File,注意扩展名必须为mdb,否则不能插入表 str += ";Jet OLEDB:Engine Type=5"; str += ";Locale Identifier=0x0804";   // Locale Identifier=0x0804,支持简体中文 catalog.Create(str); // 关闭数据库: ADODB. Connection connection = catalog.ActiveConnection as ADODB. Connection; if (connection != null) {    connection.Close(); } catalog.ActiveConnection = null; catalog = null;   这样关闭后,你就可以修改数据库扩展名或者执行删除等操作。   当创建ACCESS数据库的时候,会自动创建一个连接,为了释放.ldb文件,必须关闭这一连接。而这个连接是ADODB类的,所以很多人一直都找不到释放连接的方法。 谢谢转载引用本文! 转载时如有可能请保留以下链接, 作者将表示感谢! 原文地址:http://www.bmpj.net/forum-redirect-tid-455-goto-lastpost.html

创建文件  创建表  插入一条数据即为MyAccess类

public class MyAccess
    {
        //保存access的路径
        private string accessFileFullName;

        public string AccessFileFullName
        {
            get { return accessFileFullName; }
            set { accessFileFullName = value; }
        }


        //在指定目录下创建空白的mdb数据库文件
        public int CreateAccessDBFile(string strAccessFileName)
        {
            ADOX.Catalog catalog = new Catalog();
            if (!File.Exists(strAccessFileName))
            {
                try
                {
                    string strCreate = "Provider=Microsoft.Jet.OleDB.4.0";
                    strCreate += ";Data Source=" + strAccessFileName; // Your *.mdb File,注意扩展名必须为mdb,否则不能插入表
                    strCreate += ";Jet OLEDB:Engine Type=5";
                    strCreate += ";Locale Identifier=0x0804";   // Locale Identifier=0x0804,支持简体中文
                    catalog.Create(strCreate);

                    // 关闭数据库:
                    (catalog.ActiveConnection as ADODB.Connection).Close();
                    catalog.ActiveConnection = null;
                    catalog = null;

                    accessFileFullName = strAccessFileName;
                    return 1;
                }
                catch (Exception ex)
                {
                    accessFileFullName = null;
                    // 关闭数据库:
                    (catalog.ActiveConnection as ADODB.Connection).Close();
                    catalog.ActiveConnection = null;
                    catalog = null;
                    LogHelper.WriteLogError(ex.Message);
                    throw new Exception(string.Format("CreateAccessDBFile Error-->{0}", ex.Message));
                }
            }

            accessFileFullName = strAccessFileName;
            return 2;
        }


        //为mdb数据库文件创建表
        public bool CreateDBTable(string strTableName, params ADOX.Column[] columns)
        {
            if (accessFileFullName == null)
            {
                return false;
            }
            ADODB.Connection conn = new ADODB.Connection();
            ADOX.Catalog catalog = new ADOX.Catalog();
            try
            {
                conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + accessFileFullName, null, null, -1);
                catalog.ActiveConnection = conn;
                //创建一个表格
                ADOX.Table table = new ADOX.Table();
                //获取表名
                table.Name = strTableName;
                //遍历一个字段的集合,从而添加字段
                foreach (var column in columns)
                {
                    //如果不是bool类型的,可以为空
                    if (column.Type != DataTypeEnum.adBoolean)
                    {
                        //允许空值
                        column.Attributes = ColumnAttributesEnum.adColNullable;
                    }
                    //保存字段
                    table.Columns.Append(column);
                }
                //向数据中添加表
                catalog.Tables.Append(table);
                // 关闭数据库:
                (catalog.ActiveConnection as ADODB.Connection).Close();
                catalog.ActiveConnection = null;
                catalog = null;
            }
            catch (Exception ex)
            {
                // 关闭数据库:
                (catalog.ActiveConnection as ADODB.Connection).Close();
                catalog.ActiveConnection = null;
                catalog = null;
                LogHelper.WriteLogError(ex.Message);
                throw new Exception(string.Format("CreateDBTable Error-->{0}", ex.Message));
            }


            return true;
        }


        //特定格式 增加一行数据
        public bool AddTestData(string strSN, string strResult, string strTime)
        {
            if (accessFileFullName == null)
            {
                return false;
            }
            string strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + accessFileFullName;
            try
            {
                // 创建并打开连接
                using (OleDbConnection conn = new OleDbConnection(strConnect))
                {
                    conn.Open();
                    string strSql = "INSERT INTO TestInfoBaseSerialNo(SerialNo,TestResult,SystemTime)" + "VALUES (?,?,?)";
                    using (OleDbCommand cmd = new OleDbCommand(strSql, conn))
                    {
                        // 添加参数,并指定数据类型
                        cmd.Parameters.AddWithValue("@SerialNo", strSN);
                        cmd.Parameters.AddWithValue("@TestResult", strResult);
                        cmd.Parameters.AddWithValue("@SystemTime", strTime);
                        // 执行命令
                        int result = cmd.ExecuteNonQuery();
                        if (result >= 1)
                        {
                            return true;
                        }
                        else
                        {
                            LogHelper.WriteLogError("OleDbCommand.ExecuteNonQuery 执行失败");
                            return false;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLogError(ex.Message);
                throw;
            }

        }
    }

调用类

public class QiangSongATEMESBondMyAccess
    {
        MyAccess myAccess = new MyAccess();
        //按照客户要求创建access文件        //按照客户要求创建表        //添加一行数据 SN 时间 测试结果
        public bool CreateAccessFileCreateTableAddData(string strPath, string strTPName, string strSN, string strResult, string strTime)
        {
            string strTemp = string.Format("CreateAccessFileCreateTableAddData 开始, 测试程序名={0},SN={1},测试结果={2},测试开始时间={3},路径={4}",
                strTPName, strSN, strResult, strTime, strPath);
            LogHelper.WriteLogInfo(strTemp);

            string strDate = DateTime.Now.ToString("yyyy-MM-dd");
            string strAccessPath = strPath + strTPName + "@" + strDate + ".mdb";
            //创建需要数据表的字段
            ADOX.Column[] userSetColumns =
            {
                //这块大家注意数据类型的问题
                new ADOX.Column(){Name="SerialNo",Type=DataTypeEnum.adVarWChar, DefinedSize=100},
                new ADOX.Column(){Name="ModelName",Type=DataTypeEnum.adVarWChar, DefinedSize=200},
                new ADOX.Column(){Name="LotNumber",Type=DataTypeEnum.adVarWChar, DefinedSize=100},
                new ADOX.Column(){Name="OrderNumber",Type=DataTypeEnum.adVarWChar, DefinedSize=100},
                new ADOX.Column(){Name="Environment",Type=DataTypeEnum.adVarWChar, DefinedSize=100},
                new ADOX.Column(){Name="Inspector",Type=DataTypeEnum.adVarWChar, DefinedSize=100},
                new ADOX.Column(){Name="Customer",Type=DataTypeEnum.adVarWChar, DefinedSize=100},
                new ADOX.Column(){Name="TestResult",Type=DataTypeEnum.adVarWChar, DefinedSize=50},
                new ADOX.Column(){Name="ElapsedTime",Type=DataTypeEnum.adVarWChar, DefinedSize=100},
                new ADOX.Column(){Name="SystemTime",Type=DataTypeEnum.adVarWChar, DefinedSize=100},
                new ADOX.Column(){Name="RetestTimes",Type=DataTypeEnum.adSmallInt},
                new ADOX.Column(){Name="FixtureNumber",Type=DataTypeEnum.adInteger},
                new ADOX.Column(){Name="ChannelNumber",Type=DataTypeEnum.adInteger},
            };
            //设置数据表的名称
            string tableName = "TestInfoBaseSerialNo";
            try
            {
                LogHelper.WriteLogInfo("开始创建access文件");
                int ret = myAccess.CreateAccessDBFile(strAccessPath);
                //创建空access文件成功
                if (ret == 1)
                {
                    //创建access文件成功
                    LogHelper.WriteLogInfo("创建access文件成功,开始创建表和字段");
                    if (myAccess.CreateDBTable(tableName, userSetColumns))
                    {
                        //创建表成功
                        LogHelper.WriteLogInfo("创建表成功,开始增加一行数据");
                        if (myAccess.AddTestData(strSN, strResult, strTime))
                        {
                            LogHelper.WriteLogInfo("增加一行数据成功");
                            return true;
                        }
                        //增加数据失败
                        else
                        {
                            LogHelper.WriteLogInfo("增加一行数据失败");
                            return false;
                        }
                    }
                    //创建表失败
                    else
                    {
                        LogHelper.WriteLogInfo("创建数据库表失败");
                        return false;
                    }
                }
                //access文件已经存在了
                else if (ret == 2)
                {
                    //增加一行数据
                    LogHelper.WriteLogInfo("数据库文件已存在,增加一行数据");
                    if (myAccess.AddTestData(strSN, strResult, strTime))
                    {
                        LogHelper.WriteLogInfo("增加一行数据成功");
                        return true;
                    }
                    //增加数据失败
                    else
                    {
                        LogHelper.WriteLogInfo("增加一行数据失败");
                        return false;
                    }
                }
                //access 文件创建失败
                else
                {
                    LogHelper.WriteLogInfo("access文件创建失败");
                    return false;
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLogInfo("异常-->" + ex.Message);
                throw;
            }
        }
    }

日志log4net  参考

log4net(一)将log4net封装在类库项目中_log4net 封装-CSDN博客

 在dll类库项目中:

1、下载包:添加log4net.dll的引用

2、添加配置文件并命名为:log4net.config。设置复制到输出目录:始终复制 

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低)-->
  <log4net>
    <!--正常日志类-->
    <logger name="info">
      <level value="ALL" />
      <appender-ref ref="InfoAppender" />
    </logger>

    <!--错误日志类-->
    <logger name="error">
      <level value="ALL" />
      <appender-ref ref="ErrorAppender" />
    </logger>

    <!--正常日志附加介质-->
    <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志路径-->
      <param name= "File" value= "MESLog\"/>
      <!--是否是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--log保留天数-->
      <param name= "MaxSizeRollBackups" value= "100"/>
      <!--写到一个文件-->
      <staticLogFileName value="false"/>
      <!--单个文件大小。单位:KB|MB|GB-->
      <maximumFileSize value="200MB"/>
      <!--最多保留的文件数,设为"-1"则不限-->
      <maxSizeRollBackups value="-1"/>
      <!--日志文件名格式-->
      <param name= "DatePattern" value= "yyyyMM\\yyyyMMdd'_Info.log'"/>
      <!--日志根据日期滚动-->
      <param name= "RollingStyle" value= "Date"/>
      <!--日志文本格式-->
      <layout type="log4net.Layout.PatternLayout">
        <!--%d  时间,等价于 date-->
        <!--%t  线程-->
        <!--%-5p  日志级别-->
        <!--%C  出错类,等价于 class,可以使用:%class{1},如果给出了精度说明符,则只会打印类名中最右边的组件的相应数量。默认情况下,类名以完全限定形式输出。-->
        <!--%L  出错行-->
        <!--%M  方法名,等价于 method-->
        <!--%m  日志信息,等价于 message-->
        <!--%n  换行-->
        <param name="ConversionPattern" value="******************************%d 线程[%t] 日志级别[%p]
******************************%n类名:%class{1}%n方法名:%M - 第 [%L] 行%n消息:%m%n%n" />
      </layout>
    </appender>
    <!--错误日志附加介质-->
    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志路径-->
      <param name= "File" value= "MESLog\"/>
      <!--是否是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--log保留天数-->
      <param name= "MaxSizeRollBackups" value= "100"/>
      <!--日志文件名是否是固定不变的-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--日志文件名格式-->
      <param name= "DatePattern" value= "yyyyMM\\yyyyMMdd'_Error.log'"/>
      <!--日志根据日期滚动-->
      <param name= "RollingStyle" value= "Date"/>
      <param name="MaxFileSize" value="1"/>
      <!--日志文本格式-->
      <layout type="log4net.Layout.PatternLayout">
        <!--%d  时间,等价于 date-->
        <!--%t  线程-->
        <!--%-5p  日志级别-->
        <!--%C  出错类,等价于 class,可以使用:%class{1},如果给出了精度说明符,则只会打印类名中最右边的组件的相应数量。默认情况下,类名以完全限定形式输出。-->
        <!--%L  出错行-->
        <!--%M  方法名,等价于 method-->
        <!--%m  日志信息,等价于 message-->
        <!--%n  换行-->
        <param name="ConversionPattern" value="******************************%d 线程[%t] 日志级别[%p]
******************************%n类名:%class{1}%n方法名:%M - 第 [%L] 行%n消息:%m%n%n" />
       </layout>
    </appender>

  </log4net>
</configuration>

  

 3、在AssemblyInfo.cs文件里,写入代码,这样就和项目工程建立起联系

//增加日志配置
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

4、封装一个类:LogHelper

注意:e=null不能直接写入,否则会异常

    /// <summary>
    /// 日志类
    /// </summary>
    public class LogHelper
    {
        private static ILog logInfo = LogManager.GetLogger("info");
        private static ILog logError = LogManager.GetLogger("error");

        /// <summary>
        /// 打印正常日志
        /// </summary>
        /// <param name="message"></param>
        /// <param name="e"></param>
        public static void WriteLogInfo(object message, Exception e = null)
        {
            if (e == null)
            {
                logInfo.Info(message);
            }
            else
            {
                logInfo.Info(message, e);
            }
        }
        /// <summary>
        /// 打印错误日志
        /// </summary>
        /// <param name="message"></param>
        /// <param name="e"></param>
        public static void WriteLogError(object message, Exception e = null)
        {
            if (e == null)
            {
                logError.Error(message);
            }
            else
            {
                logError.Error(message, e);
            }
        }
    }

5、主程序调用:(我这个是以接口的形式访问,可以写在控制台里)

LogHelper.WriteLogInfo(strTemp);
LogHelper.WriteLogError(ex.Message);

写的日志截图

 方法名中带出的行数,需要.pdb文件才能正确写出来,如果没有.pdb文件则写的行数是0

VS2015使用Costura.Fody将dll打包到exe_fody 打包 dll-CSDN博客 

一、Costura.Fody是什么?
Costura.Fody是一个Fody框架下的插件,可通过Nuget安装到VS工程中。

安装之后,就可以将项目所依赖的DLL(甚至PDB)文件全部打包到EXE文件里。

 我的vs版本是2017,对应的这个2个版本正好,如果安装其他版本编译的时候就出错了

4.修改FodyWeavers.xml

修改FodyWeavers.xml内容为如下:

 

<?xml version="1.0" encoding="utf-8"?>
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
  <Costura />
</Weavers>

重新编译即完成了

 

标签:LogHelper,string,c#,创建,catalog,Access,ADOX,new,null
From: https://www.cnblogs.com/ckrgd/p/18599542

相关文章

  • # electron 打包 webview 嵌入需要调用电脑摄像头拍摄失败问题
    electron打包webview嵌入需要调用电脑摄像头拍摄失败问题这篇文章是接我cocos专栏的上一篇文章继续写的,我上一篇文章写的是cocos开发触摸屏项目,需要嵌入一个网页用来展示,最后通过electron打包成exe程序,而且网页里面是需要调用电脑摄像头进行拍摄的。问题通过前一篇......
  • 打卡信奥刷题(408)用C++信奥B3884[普及组/提高] [信息与未来 2015] 加数
    [信息与未来2015]加数题目描述给出一个正整数nnn,在nnn的右边......
  • 【语法】高阶函数:map、filter、sorted、reduce
    map【python】Python高阶函数--map函数的详细语法分析与应用实战_pythonmap-CSDN博客filter【python】Python高阶函数--filter函数的高阶用法解析与应用实战_python的filter函数的用法-CSDN博客sorted【python】Python高阶函数--sorted函数的高阶用法解析与应用实战_高阶函......
  • (12-4-03)基于CPM中英双语多模态大模型的文生图系统:实现模型(3)基于Stable Diffusion的
    12.5.5 基于StableDiffusion的图像生成模型文件stablediffusion.py用于实现一个基于StableDiffusion的图像生成模型,此文件通过定义一个包含自动编码器、噪声调度器、UNet条件模型以及自定义转换块的SDWrapper类,支持图像的编码、添加噪声、降噪和解码过程。同时,该类还集成......
  • maven仓库配置,Tomcat配置,javaweb项目创建
    把maven安装到一个没有中文目录下的文件夹中maven官网下载地址:下载地址:DownloadApacheMaven–Maven配置仓库进入maven文件夹在maven文件夹中创建仓库文件夹(注意不要中文)然后进入conf文件夹中的setting.xml文件打开,找到以下位置添加以下文件,配置阿里云私服<mirror>......
  • LeetCode | 斐波那契数
    Problem:509.斐波那契数题目斐波那契数(通常用F(n)表示)形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2),其中n>1给定n,请计算F(n)。示例1:输入:n=2输出:1解......
  • 在CodeBolcks+wxWidgets下的C++编程教程——用向导创建一个Windows GUI项目
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”:学习编程......
  • CF 杂题选做 12月
    CF1172C2Tag:概率dp2600当我们求\(x\)号的照片的答案时其他照片可以看成本质相同的照片。所以我们可以将所有照片压成三种照片\(x\),\(0\)类型,\(1\)类型。所以考虑一个naive的\(dp\),\(f_{i,j,k}\),\(i\),\(j\),\(k\)分别表示三种照片被挑选的次数,转移是easy的。......
  • Amazon S3 概念及如何集成到 .net 8 C#
    AmazonS3(SimpleStorageService)是一个高度可扩展、数据可用性高、安全性强的对象存储服务。AmazonS3使用对象存储架构,数据以对象的形式存储在桶(buckets)中,每个对象都有一个唯一的键(key)。 本文主要分为两个部分:1、AmazonS3相关概念2、.net集成的代码*阅读提示:鼠标悬......
  • 记录一种校验方式-crc16(python+C语言)
    此篇文章在2023年3月24日被记录最近在写boot升级代码时,需要上位机发送固件包到下位机,因为固件包太大,因此需要分包发送,分包发送涉及到校验问题,特意对crc16校验方法进行记录计算方法预置1个16位的寄存器为十六进制FFFF(即全为1,我称为种子);称此寄存器为CRC寄存器;把第一个8位二......