Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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# 发生类型为“System.Data.OleDb.OLEDBEException”的未处理异常_C#_Oledb - Fatal编程技术网

C# 发生类型为“System.Data.OleDb.OLEDBEException”的未处理异常

C# 发生类型为“System.Data.OleDb.OLEDBEException”的未处理异常,c#,oledb,C#,Oledb,我正在创建一个程序,其中用户将登录到系统,但它会出现如下错误 我还使用c编程语言和数据库中的Ms Access 这是我的全部密码 using System; using System.Drawing; using System.Windows.Forms; using System.Threading; using System.Data.OleDb; using System.Drawing.Drawing2D; namespace Shakeys_Inventory_System {

我正在创建一个程序,其中用户将登录到系统,但它会出现如下错误

我还使用c编程语言和数据库中的Ms Access

这是我的全部密码

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Data.OleDb;
using System.Drawing.Drawing2D;

namespace Shakeys_Inventory_System
{
    public partial class frmLogin : Form
    {
        private OleDbConnection cn = new OleDbConnection();

        public frmLogin()
        {
            //SplashScreen
            Thread t = new Thread(new ThreadStart(SplashStart));
            t.Start();
            Thread.Sleep(2500);

            InitializeComponent();

            this.BackColor = Color.White;
            panel1.BackColor = Color.FromArgb(25, Color.Black);

            t.Abort();

            cn.ConnectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C: \Users\Raphael\Documents\Visual Studio 2015\Projects\Shakeys_Inventory_System\Shakeys_Inventory_System\ShakeysDatabase.accdb");
        }

        //Blurred Panel *START
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.DrawLine(Pens.Yellow, 0, 0, 100, 100);
        }

        public void SplashStart()
        {
            Application.Run(new frmSplashScreen());
        }

        public void DrawPath(Pen pen, GraphicsPath path)
        { 

        }

        private void frmLogin_Load(object sender, EventArgs e)
        {

        }

        //Button Login Start
        private void btn_Login_Click(object sender, EventArgs e)
        {
            cn.Open();
            OleDbCommand cm = new OleDbCommand();
            cm.Connection = cn;
            cm.CommandText = "Select * from UsernameInfo where Username = '" +txt_Username.Text+ "' and password = '"+txt_Password.Text+"'";
            OleDbDataReader odr = cm.ExecuteReader();
            int cnt = 0;
            while (odr.Read())
            {
                cnt++;
            }
            if (cnt == 1)
            {
                this.Hide();
                frmHomepage fhp = new frmHomepage("Welcome:"+ txt_Username.Text);
                fhp.ShowDialog();
            }
            else
            {
                MessageBox.Show("Username or Password is Incorrect!", "ERROR!",MessageBoxButtons.OK,MessageBoxIcon.Error,MessageBoxDefaultButton.Button1);
            }
            cn.Close();
        }

        //Button Quit *Start
        private void btn_Quit_Click(object sender, EventArgs e)
        {
            DialogResult Result1 = MessageBox.Show("Do you want to CLOSE the program?", "Warning!",MessageBoxButtons.YesNo,MessageBoxIcon.Question);

            if (Result1 == DialogResult.Yes)
            {
                Application.Exit();
            }
        }
    }
}
顺便说一下,我在MSAccess中创建了自己的数据库,并将其中的路径文件复制到我的

cn.ConnectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C: \Users\Raphael\Documents\Visual Studio 2015\Projects\Shakeys_Inventory_System\Shakeys_Inventory_System\ShakeysDatabase.accdb");
路径文件是正确的,我的查询也是正确的,表也是,我的问题是,为什么我会出错


谢谢你的帮助

?字符是参数所在位置的占位符

cm.CommandText = "Select * from UsernameInfo where Username = ? and password = ?";
现在,按照编写查询的相同顺序添加参数

cm.Parameters.AddWithValue( "parmUserName", txt_Username.Text );
cm.Parameters.AddWithValue( "parmPassword", txt_Password.Text );
现在执行您的查询

OleDbDataReader odr = cm.ExecuteReader();
如果有人要在文本中包含一个“字符”,它将预先关闭引用的连接,并将其余字符丢弃,从而导致错误

此外,您的路径还有一个额外的空间C:\而不是C:\

回馈

澄清?。如果您连接一个字符串来构建查询,那么您将完全接受sql注入。这个从字面上看是什么?字符充当占位符的意思。我将为query命令提供参数,我希望您将第一个参数放在第一个参数的位置?位于,第二个参数位于第二个

那么,让我们看看您的原始查询

"Select * from UsernameInfo where Username = '" +txt_Username.Text+ "' and password = '"+txt_Password.Text+"'";
假设我输入了以下值

txt_Username.Text = "O'Brien"
txt_Password.Text = "it's ok"
您得到的sql命令实际上会变成

Select * from UsernameInfo where Username = 'O'Brien' and password = 'it's ok'
请注意,用户和密码值之间的报价余额不匹配

通过使用?作为席位持有者

Select * from UsernameInfo where Username = ? and password = ?

cm.Parameters.AddWithValue( "parmUserName", txt_Username.Text );
cm.Parameters.AddWithValue( "parmPassword", txt_Password.Text );
将成为

Select * from UsernameInfo where Username = [value of first parameter] and password = [value of second parameter]
引擎将识别字符串、数字、日期等数据类型,并为您进行处理。您可以更明确地声明参数的类型,但它通常会为您检测类型

现在,对于SQL注入,我并不肯定通过access暴露,但通常是;分号表示一条sql语句的结尾,并允许另一条sql语句。有人知道了你桌子的名字。在SQL中,双破折号被认为是后面的注释并忽略它。同样,这只是一个样本。您的查询是用构建字符串构造的

Select * from UsernameInfo where Username = 'O'Brien' and password = 'it's ok'
以及txtUser_Name.Text='或1=1的值;截断表格-

结果查询如下所示 从UsernameInfo中选择*,其中Username=或1=1;截断表YourTable;-'密码='没问题'

实际上,您将执行第一条语句,该语句将通过OR 1=1返回所有行,OR 1=1始终为真,然后下一条语句将删除可能是数据库一部分的YourTable中的所有记录。最后,'和密码部分将被完全忽略,因为它是通过-


更有意义吗?

代码抛出错误的是哪一行?我为什么会出错?仅仅给出异常类型是不够的。您需要提供异常的消息,最好是堆栈跟踪。抛出的exception.WIDE-OPEN TO SQL注入上的任何内部异常也是如此。把你的问题参数化。奈克斯·特伦爵士,在cn.Open一行;在我的btn代码中_login@raphaelmendoza,有关参数和sql注入的说明,请参见修订的答案。