开发者社区> 问答> 正文

如何在C#中解决此SqlConnection?

这是我的连接课程

class connection
{
        public SqlConnection con;
        public SqlCommand cmd;
        public SqlDataAdapter sda;
        String pkk;

        public void connectionFunc()
        {
            con = new SqlConnection(@"Data Source=.;Initial Catalog=payroll;Integrated Security=True");
            con.Open();
        }

        public void dataSend(String SQL)
        {
            try
            {
                connectionFunc();
                cmd = new SqlCommand(SQL, con);
                cmd.ExecuteNonQuery();
                pkk = "";
            }
            catch(Exception)
            {
                pkk = "error";
            }
            con.Close();
        }

        public void dataGet(String SQL)
        {
            try
            {
                connectionFunc();
                sda = new SqlDataAdapter(SQL, con);
            }
            catch(Exception)
            {
            }
        }
}

这是该类的使用:

connection con = new connection();
con.dataGet("Select * from [users] Where Userame = '" + textBox1.Text + "' and Password = '" + textBox2.Text + "'");

DataTable dt = new DataTable();

// this line throws an error
con.sda.Fill(dt);   

if(dt.Rows.Count > 0)
{
    this.Hide();
    Mainpage obj = new Mainpage();
    obj.Show();
}
else
{
    MessageBox.Show("Invalid UserName Or Password..!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

我收到以下错误:

Payroll_Manegement.exe中发生了'System.NullReferenceException'类型的未处理异常

我不知道如果有人可以帮助我,这将是什么大问题。

展开
收起
祖安文状元 2020-01-04 15:13:30 845 0
1 条回答
写回答
取消 提交回答
  • 回答您的问题:该错误来自以下事实:您的DataTable仅在SqlDataAdapter.Fill被激发之前被实例化,而不被填充,因此,当后者尝试执行有用的操作时,它只能返回一个解释确切错误的异常。

    您的连接类会因不安全的变量范围(为什么在所有地方都使用public?)和不存在的连接池而使我痛苦。使用这样的类会为各种不安全的恐怖打开您的应用程序。如果您的应用程序不太复杂,请尝试使事情保持简单;.NET Framework的基础知识已经足以满足您的目的。只需执行与以下代码类似的操作(就查询的参数化而言,就像其他建议的一样):

    string connectionString = "server=myServer;User ID=myUser;Password=myPwd;"; // could also be internal static on class level
    
    string theQuery = "SELECT * FROM dbo.Users WHERE Username = @userName AND Password = @password";
    
    using (SqlConnection sqlConnection = new SqlConnection(connectionString))
    {
        sqlConnection.Open();
    
        using (SqlCommand sqlCommand = new SqlCommand(theQuery, sqlConnection))
        {
            sqlCommand.Parameters.AddWithValue("@userName", textBox1.Text);
            sqlCommand.Parameters.AddWithValue("@password", textBox2.Text);
    
            DataTable dataTable = new DataTable();
            dataTable.Load(sqlCommand.ExecuteReader());
            if (dataTable.Rows > 0)
            {
                SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
                sqlDataAdapter.Fill(dataTable);
            }
        }
    }
    
    

    另外,对于更复杂的应用程序,您可以首先学习Entity Framework https://docs.microsoft.com/zh-cn/ef/ef6/get-started,并进行不重新发明轮子的训练。适应需要一些时间,但确实会有所收获。

    祝您改善代码!

    2020-01-06 10:36:21
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载