在 C# WinForm 应用程序中写入数据库时​​遇到问题

     2023-05-07     87

关键词:

【中文标题】在 C# WinForm 应用程序中写入数据库时​​遇到问题【英文标题】:Trouble writing to database in C# WinForm Application 【发布时间】:2013-07-03 14:37:16 【问题描述】:

我在专业编程方面相对缺乏经验,但我正在尝试编写一个与 MS Access 数据库接口的程序。本质上,我正在收集表单中的信息,并尝试在每个条目的新行中传递信息。我有一个打开的 OleDbConnection,我的测试显示我能够看到哪一行会有新条目,但是当我点击提交按钮时,catch 中没有显示错误,但数据库保持不变。我最初将代码放在从 click 事件调用的方法中,但我只是将代码带到事件处理程序以验证问题不在于调用。

private void btnSubmit_Click(object sender, EventArgs e)
    

        if (DBConnection.State.Equals(ConnectionState.Closed))
        
            DBConnection.Open();
        

        try
        
            MessageBox.Show("Save Data at index: " + intRowPosition.ToString());

            OleDbCommand OledbInsert = new OleDbCommand("Insert INTO RetentionTable (DateTime,Center,CSP,MemberID,ContractNumber,RetentionType,RetentionTrigger,MemberReason,ActionTaken,Other) VALUES('" + DateTime.Now.ToString() + "','" + GetCenter("") + "','" + GetName("") + "','" + GetMemberID("") + "','" + GetContractNumber("") + "','" + GetType("") + "','" + GetTrigger("") + "','" + GetReason("") + "','" + GetAction("") + "', + GetOther("")," DBConnection);

            intRowPosition++;
        

        catch (Exception ex)
        
            MessageBox.Show(ex.Message.ToString());
            MessageBox.Show(ex.StackTrace.ToString());
        
        finally
        
            RefreshDBConnection();
        

    

任何关于为什么这不是写作的想法将不胜感激。

【问题讨论】:

使用'String.Format'让你的查询更容易管理msdn.microsoft.com/en-us/library/system.string.format.aspx 好吧,你有多个问题,但please use parameters 而不是构建 SQL 字符串! 【参考方案1】:

你上面的代码有很多问题。

首先,应该执行一个命令,而不是简单地声明。 (这就是数据库没有被修改的原因) 其次,你在语句中使用保留关键字(所以即使你执行你的语句,它也会失败并抛出异常) 第三,您正在连接字符串以构建命令文本。一种 非常糟糕的举动,会使您的应用程序容易受到SQL injection 攻击 四、使用后应关闭连接

让我试着写一个替换代码

string cmdText = "Insert INTO RetentionTable " +
                "([DateTime],Center,CSP,MemberID,ContractNumber,RetentionType," + 
                "RetentionTrigger,MemberReason,ActionTaken,Other) " + 
                "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
 using(OleDbConnection cn = new OleDbConnection(conString))
 using(OleDbCommand cmd = new OleDbCommand(cmdText, cn))
 
    cmd.Parameters.AddWithValue("@p1", DateTime.Now.ToString());
    cmd.Parameters.AddWithValue("@p2", GetCenter("")); 
    cmd.Parameters.AddWithValue("@p3", GetName(""));
    cmd.Parameters.AddWithValue("@p4", GetMemberID(""));
    cmd.Parameters.AddWithValue("@p5", GetContractNumber(""));
    cmd.Parameters.AddWithValue("@p6", GetType("")); 
    cmd.Parameters.AddWithValue("@p7", GetTrigger(""));
    cmd.Parameters.AddWithValue("@p8", GetReason(""));
    cmd.Parameters.AddWithValue("@p9", GetAction(""));
    cmd.Parameters.AddWithValue("@p10", GetOther(""));
    cmd.ExecuteNonQuery();
 

DATETIME 是 Access 中的保留关键字,因此,如果要将其用于列名,则需要将其括在方括号中。

字符串连接在 MSAccess 中是一种不好的做法,但在其他数据库中它是一个致命缺陷,您的代码可以用于 Sql Injections(在 Access 中更难但并非不可能)。如果您像我的示例中那样使用参数化查询,则可以消除 Sql 注入问题,而且还可以让框架代码以日期、字符串和小数所需的正确格式将正确的值传递给数据库引擎。

要考虑的另一点是没有全局 OleDbConnection 对象,而是在需要时创建、使用和销毁该对象。 Connection Pooling 将避免性能问题,并且无论出于何种原因连接失败时,您的代码都不会遭受内存泄漏

我还想补充一点,您的 GetXXXXX 方法似乎都返回字符串。请记住,这些方法应返回与您要写入的底层数据库字段兼容的值

【讨论】:

您可以解释您的第一个项目是如何完成的,您在第二个点中引用了哪些保留关键字,以及为什么您的第三个项目是不好的举动以及好的举动是什么。这样可能是一个更有成效的答案。只是一些建议。 @Tombala,等一下。这是一个很长的答案 只是几件事。首先,(非常次要)值字符串的第二个 " 和 ) 颠倒了。容易修复。我遇到的问题是它告诉我“当前上下文中不存在名称 'conString'。”怎么能那我解决这个问题?再一次,我有点成熟...... conString 变量应该包含你真正的连接字符串(通常在文件配置中定义) 哇,非常感谢。我知道我有很多东西要学,但是你们提供了很多帮助。我将基于另一个链接到 mdb 的教程,这让我陷入了一个难以摆脱的困境。我的程序运行良好,麻烦少得多。很高兴我加入了 ***。我将来会回来的。希望有一天我可以贡献自己的答案,但现在。我会尽可能多地吸收。老实说,你不知道我是多么松了一口气,这是正常的。谢谢十亿!【参考方案2】:

这可能是您要放入数据库的值周围的语音标记。尝试改为撇号。

无论如何,我强烈建议将最终的 SQL 存储在字符串中并将其打印到日志文件或屏幕上,然后将其复制到 Access SQL 编辑器并尝试运行它。然后你会看到是否有错误以及它是什么。

【讨论】:

如何在winform c#中禁用按钮时将焦点设置在按钮上?

...时间】:2021-05-2120:36:02【问题描述】:我想在Windows窗体应用程序中禁用按钮时在按钮中设置焦点。有没有办法实现这个目标?背景:我正在制作一个可供盲人使用的应用程序,因此当按钮启用时,屏幕阅读器将读取按钮内容,... 查看详情

如何在 C# WinForm 桌面应用程序中存储 MySql 数据库连接字符串

】如何在C#WinForm桌面应用程序中存储MySql数据库连接字符串【英文标题】:HowtostoreMySqldatabaseconnectionstringinC#WinFromdesktopapplication【发布时间】:2019-08-2201:31:38【问题描述】:在代码中使用server、user、password和database数据似乎不正确... 查看详情

在winform c#中去除捕捉图像背景中的黑暗

...间】:2016-06-0122:06:14【问题描述】:我从事图像捕获窗口应用程序的工作。当我通过窗口平板电脑中的应用程序捕获图像时,图像质量低并且在捕获的图像背景中显示黑暗。当我用平板电脑拍摄图像时,图像质量很好。我的代码... 查看详情

在 C# winform 中使用 app.config 访问数据库连接字符串

...2012-01-1813:15:33【问题描述】:我似乎无法在我的c#winforms应用程序中访问app.config数据库连接字符串。app.config代码<connectionStrings><add 查看详情

在winform程序中设置管理员权限及为用户组添加写入权限

原文:在Winform程序中设置管理员权限及为用户组添加写入权限在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行程序具有管理员权限或者设置运行程序的目录具有写入的权限,如果是在... 查看详情

在winform程序中设置管理员权限及为用户组添加写入权限

在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行程序具有管理员权限或者设置运行程序的目录具有写入的权限,如果是在操作系统里面,我们可以设置运行程序以管理员身份运行,... 查看详情

在winform程序中设置管理员权限及为用户组添加写入权限

在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行程序具有管理员权限或者设置运行程序的目录具有写入的权限,如果是在操作系统里面,我们可以设置运行程序以管理员身份运行,... 查看详情

c#的winform程序中,radiobutton的用法

....DataSource=集合;这种方式来改变。 参考技术B如果你是连接数据库的话不同的radiobutton绑定不同的字段就可以了不知道是不是连接数据库啊~~每一个radio 查看详情

将数据从 C# 写入 MDF 数据库

...码用于侦听鼠标上移事件,然后将数据写入数据库。我在应用程序的VisualStudio中本地创建了一个.MDF数据库文件。我正在使用下面的代码。问题是当我安装应用程序后在SQLServerManagementStudio中打开.MDF数据库文件时,我看不到任 查看详情

c#怎么保存winform应用程序的配置?

是通过app.config吗?供参考:1.自定义一个配置文件(.config/.txt),比如:在BIN目录下生成一个setting.config,通过winform界面把配置参数全部保存到这里面来。2.保存到app.config中,可以把一些配置参数保存到app.config,这样在窗体编译的时... 查看详情

c#在winform中操作数据库,实现数据增删改查

...本的数据操作,增删改查这几个操作。(1)先定义一个数据库操作的公共类:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usin 查看详情

在 Visual Studio 2012 中发布 C# winform 应用程序

】在VisualStudio2012中发布C#winform应用程序【英文标题】:publishingaC#winformapplicationinVisualStudio2012【发布时间】:2014-05-2514:25:12【问题描述】:我在VisualStudio2012中构建了一个C#winform应用程序。我想将该应用程序发布到全世界。通过Vis... 查看详情

在 WinForm C# 中单击按钮时更改表格单元格颜色

】在WinFormC#中单击按钮时更改表格单元格颜色【英文标题】:ChangetablecellcolorwhenabuttonisclickedinWinFormC#【发布时间】:2021-02-2208:45:18【问题描述】:我是Windows窗体的新手,已经寻找了三天的答案,但没有运气。我有一个按钮和一... 查看详情

由任务计划程序启动时隐藏 C# winform 应用程序窗口

】由任务计划程序启动时隐藏C#winform应用程序窗口【英文标题】:HideC#winformAppWindowWhenStartedbyTaskScheduler【发布时间】:2014-08-0405:00:31【问题描述】:我已经在谷歌上搜索过这个并阅读了一些资源,但我找不到一个好的答案。有谁... 查看详情

C# 程序(Winform 和 WPF)在启动文件夹中创建快捷方式时被视为病毒?

】C#程序(Winform和WPF)在启动文件夹中创建快捷方式时被视为病毒?【英文标题】:C#program(WinformandWPF)betreatedasviruswhencreateshortcutinstartupfolder?【发布时间】:2021-08-0814:43:27【问题描述】:WindowsDefender通常将我的程序作为病毒隔离... 查看详情

c#中对web程序进行数据库连接配置的问题,有没有winform和webforom通用的办法?

...做winform程序,之前的做法是写了个类库(mData.dll)来专门做数据库中每一个表的增加、删除、修改、查询、统计、筛选等操作。然后写另一个类库(mBLL.dll)专门专门针对不同的窗体上所有关于需要访问数据库的操作。主项目中只是... 查看详情

C# Winform 每 10 秒从 API 获取数据并保存在文件夹中

】C#Winform每10秒从API获取数据并保存在文件夹中【英文标题】:C#WinformgetdatafromAPIevery10secondsandsaveinfolder【发布时间】:2019-09-2913:28:48【问题描述】:我想每10秒向API发送POST数据并接收数据。接下来我想将接收到的数据解析为json... 查看详情

请问c#正规做winform程序时,sql文都是放在哪里的?怎样放才能实现sql和代码脱离的效果?

...一层的是UI<界面>的事件,比如:“按钮”第二次是数据库方面的,比如说:一些打开数据库,读取数据的方法第三层属于业务连接层,负责链接一层和三层的。这是最简单的分成,等你明白数据流向的话,还要细分,这样... 查看详情