首页 > 数据库 >.net通过共享文件方式读取SQLLite数据库整理两种方案

.net通过共享文件方式读取SQLLite数据库整理两种方案

时间:2024-02-05 11:33:40浏览次数:22  
标签:return 读取 var using net SQLLite 共享 string

项目环境:win10,框架 .net 6.0

问题描述:客户现场有一台测量设备,测量数据存放在测量设备本地SQLLite中,应用服务器存在另一台电脑上,客户希望通过共享文件方式读取SQLLite中的数据定时同步到应用服务器上进行查询展示。

解决方案
网上搜了一下资料整理了一下大概两种方法:
1.没有账号密码限制的,可以将共享文件夹映射成网络驱动器的方式读取,数据库连接配置映射的驱动器路径: Data Source=Z:\OP140\test.db
2.通过advapi32.dll访问需要账号密码登录的共享文件夹读取,数据库连接使用共享文件路径:Data Source=//192.168.1.1/OP140/test.db

示例代码:

using Dapper;
using Microsoft.Win32.SafeHandles;
using System.Data.SQLite;
using System.Runtime.InteropServices;
using System.Security.Principal;

namespace MyApp
{
    /// <summary>
    /// 读取共享sqllite DEMO
    /// </summary>
    internal class Program
    {
        static void Main(string[] args)
        {
            //方法1:共享文件夹映射成网络驱动器的方式读取>>>
            using (var dbConnection = new SQLiteConnection($"Data Source=Z:\\OP140\\test.db"))
            {
                var querySql1 = $"查询语句";
                var query1 = dbConnection.Query<dynamic>(querySql1).ToList();
            }
            //方法1:共享文件夹映射成网络驱动器的方式读取<<<

            //方法2:通过advapi32.dll访问需要账号密码登录的共享文件夹读取>>>
            Func<string, string> func = (string floder) =>
            {
                var file = GetNewestDbjFile("\\\\192.168.1.1\\OP140", "test.db");

                if (file is null)
                {
                    return "false";
                }

                var sqlliteConnStr = file.FullName.Replace(@"\", "/");

                using (var dbConnection = new SQLiteConnection($"Data Source={sqlliteConnStr}"))
                {
                    var querySql = $"查询语句";
                    var query = dbConnection.Query<dynamic>(querySql).ToList();

                    return "true";
                }
            };

            if (Program.ImpersonateValidUser("192.168.1.1", "账号", "密码", "\\\\192.168.1.1\\OP140", func) == "true")
            {
                //查询成功
            }
            //方法2:通过advapi32.dll访问需要账号密码登录的共享文件夹读取<<<
        }

        /// <summary>
        /// 链接共享路径,并且读取指定的文件
        /// </summary>
        /// <param name="path">共享路径</param>
        /// <param name="fileName">文件名</param>
        /// <returns></returns>
        private static FileInfo GetNewestDbjFile(string path, string fileName)
        {
            try
            {
                var directoryFile = new DirectoryInfo(path);
                FileInfo[] file = directoryFile.GetFiles();
                if (file.Length != 0)
                {
                    return file.Where(x => x.Name.Equals(fileName)).First();
                }
                else
                {
                    //没有文件处理
                }
            }
            catch (Exception ex)
            {
                //错误处理
             }
            return null;
        }

        //logon types
        private const int Logon32_Logon_Interactive = 9;
        // logon providers
        private const int Logon32_Provider_Default = 0;

        [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        private static extern bool LogonUser(string lpszUserName, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out SafeAccessTokenHandle phToken);

        /// <summary>
        /// 模拟本地用户
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="domain">域名</param>
        /// <param name="username">账号</param>
        /// <param name="password">密码</param>
        /// <param name="path">共享文件夹路径</param>
        /// <param name="func"></param>
        /// <returns></returns>
        private static T ImpersonateValidUser<T>(string domain, string username, string password, string path, Func<string, T> func) where T : class
        {
            SafeAccessTokenHandle safeAccessTokenHandle;

            bool isSuccess = LogonUser(username, domain, password, Logon32_Logon_Interactive, Logon32_Provider_Default, out safeAccessTokenHandle);

            if (isSuccess == false)
            {
                return default(T);
            }

            return WindowsIdentity.RunImpersonated(safeAccessTokenHandle, () =>
            {
                return func(path);
            }
           );
        }
    }
}

参考链接:
C#调用advapi32.dll访问需要账号密码登录的共享文件夹

标签:return,读取,var,using,net,SQLLite,共享,string
From: https://www.cnblogs.com/wateri00/p/18007659

相关文章

  • netty内存分配
    https://www.cnblogs.com/s686zhou/p/15714858.htmlhttps://www.jianshu.com/p/1ce3bc2d7c5e https://blog.csdn.net/wangwei19871103/category_9681495_2.htmlnetty4.1.50版本rss分配内存链路PooledByteBufAllocator#ioBuffer(intinitialCapacity,intmaxCapacity)=>Ab......
  • DevExpress ASP.NET Web Forms v23.2最新版本系统环境配置要求
    本文档包含有关安装和使用 DevExpressASP.NETWebForms控件的系统要求的信息。点击获取DevExpressv23.2正式版.NETFrameworkDevExpressASP.NETWebForms控件和MVC扩展支持以下.NETFramework版本。IDEDevExpressASP.NET控件支持以下VisualStudio版本。Visual......
  • 在K8S中,Kubernetes与Docker的关系?
    在Kubernetes(简称K8s)与Docker之间,存在一种互补和依赖的关系:互补关系:Docker:提供容器化解决方案,允许开发人员将应用及其依赖打包到可移植的容器镜像中。Docker主要负责构建、运行和分发这些容器。Kubernetes:是一个容器编排系统,它的目标是自动化部署、扩展以及管理容器化的应用......
  • C#/.NET该如何自学入门?
    前言随着DotNetGuide技术社区交流群的不断壮大(目前4个群都已经满500人,已开5群现已有180多个小伙伴),越来越多应届生和其他领域的小伙伴加入了我们这个大家庭。在此期间我在个人微信、公众号和技术交流群里看到比较多的留言和提问就是:C#/.NET该如何自学入门?有什么好的学习资料和路线......
  • .NET周刊【1月第3期 2024-01-24】
    国内文章.NET开源的简单、快速、强大的前后端分离后台权限管理系统https://www.cnblogs.com/Can-daydayup/p/17980851本文介绍了中台Admin,一款基于Vue3和.NET8的开源后台权限管理系统。它具备前后端分离架构,支持多租户、接口和数据权限、动态Api等功能,并集成了多种中间件和服务......
  • profinet转CANopen网关在博图的profinet从站配置步骤
    profinet转CANopen网关在博图的profinet从站配置步骤Profinet转CANopen网关(XD-COPNm20)是一种用于实现CANopen设备与Profinet网络连接起来进行设备之间的数据交换和通信的设备。CANopen和Profinet是两种常见的工业通信协议,它们在自动化控制系统中有着广泛的应用。因此CANopen转Pro......
  • 使用SDL库读取手柄摇杆数据
    title:aliases:tags:-cppcategory:方法stars:url:creation-time:2024-02-0420:03modification-time:2024-02-0420:13:44由于之前使用MMSystem库对手柄的数据进行读取[[2023-10-17]]的方式,在笔记本上接手柄总是出现一些虚拟手柄占用接口的问题(未找到原因......
  • 文件流(File Stream)是NTFS文件系统中的一个特性,它允许在一个文件中存储多个数据流。每
    文件流(FileStream)是NTFS文件系统中的一个特性,它允许在一个文件中存储多个数据流。每个数据流都可以独立地读取和写入数据,并与主数据流关联。文件流在文件系统中起到存储和管理附加属性、元数据等信息的作用。技术原理:NTFS文件系统使用文件标识符(FileID)来唯一标识每个文件。对......
  • windows查看端口占用,通过端口找进程号(查找进程号),通过进程号定位应用名(查找应用)(netstat
     文章目录通过端口号查看进程号`netstat`通过进程号定位应用程序`tasklist` 通过端口号查看进程号netstat在Windows系统中,可以使用netstat命令来查看端口的占用情况。以下是具体的步骤:打开命令提示符(CMD):按Win+R组合键打开运行对话框,输入cmd并按Enter键。......
  • Windows自带搜索太慢?搜索神器listary推荐_network
    今天推荐的软件是listary,那个经常被拼写为listray的listary。相信很多人都用过everything,一款非常强大的搜索软件,但是,everything虽然搜索迅速,但是功能比较单一,开启比较麻烦,可能你打开everything的时间用listary已经搜完了。效果如下:还支持计算器,打开网址,网络搜索,命令(网络搜索和......