Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#保存记录未重定向到正确的MS Access数据库_C#_.net_Ms Access - Fatal编程技术网

C#保存记录未重定向到正确的MS Access数据库

C#保存记录未重定向到正确的MS Access数据库,c#,.net,ms-access,C#,.net,Ms Access,我正在C#中构建VSTO Excel加载项。此加载项将记录保存到单个MS Access数据库。由于Access不支持多个用户更新同一数据库,因此我必须为每个用户创建一个访问权限。数据库位于SharePoint文件夹中,该文件夹已同步到用户桌面,因此我可以对所有数据库使用类似的文件路径,以下是我获取数据库文件路径的方式: string FilesPath1 = "C:/Users/" + loggedUser + "/Company Name/App Folder/D

我正在C#中构建VSTO Excel加载项。此加载项将记录保存到单个MS Access数据库。由于Access不支持多个用户更新同一数据库,因此我必须为每个用户创建一个访问权限。数据库位于SharePoint文件夹中,该文件夹已同步到用户桌面,因此我可以对所有数据库使用类似的文件路径,以下是我获取数据库文件路径的方式:

string FilesPath1 = "C:/Users/" + loggedUser + "/Company Name/App Folder/DB/";
其中loggedUser声明如下:

public static string loggedUser = Environment.UserName.ToUpper()
因此,当加载项运行时,将记录用户名(在我的示例中为AALV)。下面是保存请求功能的完整代码

public static void SaveIndividualRequest(string idRequestUpdate,
                                                 string requestType,
                                                 string requestedBy,
                                                 string requestedTo,
                                                 string deadline
                                                 )
        {

            // instance for date
            DateTime today = DateTime.UtcNow.Date;
            try
            {
                string FilesPath1 = "C:/Users/" + loggedUser + "/Company Name/App Folder/DB/";
                string IndividualRequestsPath1 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FilesPath1 + loggedUser + ".mdb;Jet OLEDB:Database Password=password;";
                OleDbConnection connIndividualReq1 = new OleDbConnection(IndividualRequestsPath1);

                connIndividualReq1.Open();
                cmd.CommandText = $"INSERT INTO [Requests] ([Request ID], [Request type], [Requested by], [Requested to], [Requested on], [Deadline], [Status]) VALUES " +
                    $"('{idRequestUpdate}', '{requestType}', '{requestedBy}', '{requestedTo}', '{today}', '{deadline}', 'Pending');";
                cmd.Connection = connIndividualReq1;
                cmd.ExecuteNonQuery();

                //inform user
                MessageBox.Show("Record has been saved and emal will be sent");

                connIndividualReq1.Close();
                cmd.Cancel();

            }
            catch (Exception ex) { MessageBox.Show(ex.Message); connIndividualReq.Close(); cmd.Cancel(); }
        }
行:
string IndividualRequestsPath1=“Provider=Microsoft.ACE.OLEDB.12.0;数据源=“+filepath 1+loggedUser+”.mdb;Jet-OLEDB:Database Password=Password;”
在字符串末尾添加
loggedUser
,以获取单个access数据库(所有数据库都被命名为所有用户的用户名)

当我在笔记本电脑中运行此函数时,它可以完美地工作,不仅在调试中,而且在发布和安装外接程序之后。但是,当它在其他用户的笔记本电脑中运行时,会出现一个错误,说明找不到数据库,但加载项正在查找我的姓名首字母,而不是登录的用户:

我还检查了
Environment.UserName()
在其他用户运行时存储的内容,并将其放置在表单中,事实上它显示的是正确的用户


我希望你们中的任何人都能帮助我解决问题。

请尝试从cmd.exe>SET验证环境变量设置是否正确。不要将环境存储在变量中。用户名直接在SaveIndividualRequest函数中使用。将其存储在静态变量中并没有什么好处,在代码到达methodSide注释之前,可以在某个地方对其进行更改。虽然使用Sql注入攻击访问有点困难,但如果其中一些变量包含一个引号,那么您的代码是高度不安全的,并且容易崩溃。不要连接字符串以生成SQL命令,请使用参数“Access不支持多个用户更新同一数据库”是什么意思?Access当然支持多个用户。每个用户都运行自己的GUI前端副本,该副本连接到数据后端。至少我对服务器上的访问前端和VBA编码以及后端没有问题。然而,我从未使用C#/.net编写过前端代码,也没有使用SharePoint编写过后端代码。维护多个相同结构的数据库是一场噩梦。是否需要合并此数据以进行报告?作为一个图形用户界面,很好!