0

在有人否决我的问题之前,我想说这是我第一次在 C# 中使用类,我已经做了很多研究,但我仍然遇到错误。新手来了

我试图将 Insert、Delete、Update 和 Count 语句放在类文件中,以便我的代码整洁。

这是我制作的类文件(当然是在研究的帮助下):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using System.IO;
using System.Windows.Forms;

namespace classlib
{
public class DBConnect
{
    private static MySqlConnection mycon;
    private string server;
    private string database;
    private string uid;
    private string password;

    public DBConnect()
    {
        Initialize();
    }

    private void Initialize()
    {
        server = "localhost";
        database = "restaurantdb";
        uid = "user";
        password = "root";
        string connectionString;
        connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";
        mycon = new MySqlConnection(connectionString);
    }

    private static bool OpenConnection()
    {
        try
        {
                mycon.Open();
            return true;
        }
        catch (MySqlException ex)
        {
            switch (ex.Number)
            {
                case 0:
                    MessageBox.Show("Cannot connect to server.  Contact administrator");
                    break;

                case 1045:
                    MessageBox.Show("Invalid username/password, please try again");
                    break;
            }
            return false;
        }
    }

    private static bool CloseConnnection()
    {
        try
        {
            mycon.Close();
            return true;
        }

        catch (MySqlException ex)
        {
            MessageBox.Show(ex.Message);
            return false;
        }
    }


    public static void Insert(string query)
    {
        if (OpenConnection() == true)
        {
            MySqlCommand cmd = new MySqlCommand(query, mycon);
            cmd.ExecuteNonQuery();
            CloseConnnection();
        }
    }

    public static void Update(string query)
    {
        if (OpenConnection() == true)
        {
            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = query;
            cmd.Connection = mycon;

            cmd.ExecuteNonQuery();
            CloseConnnection();
        }
    }

    public static void Delete(string query)
    {
        if (OpenConnection() == true)
        {
            MySqlCommand cmd = new MySqlCommand(query, mycon);
            cmd.ExecuteNonQuery();
            CloseConnnection();
        }
    }

    public static int Count(string query)
    {
        int count = -1;

        if (OpenConnection() == true)
        {
            MySqlCommand cmd = new MySqlCommand(query, mycon);

            count = int.Parse(cmd.ExecuteScalar() + "");

            CloseConnnection();

            return count;
        }

        else
        {
            return count;
        }
    }

}
}

我只是在尝试某种形式的计数方法。这是我的代码:

        MessageBox.Show("NUMBER OF ACCOUNTS IN DATABASE = "+ DBConnect.Count("SELECT count(*) FROM usersettingsdb") +"", "CONFIRMATION");

但是我在类文件上的OpenConnection()方法上得到了这个错误mycon.Open()

Object reference not set to an instance of an object.

如何删除上述错误并通过像这样调用它来访问方法DBConnect.MethodName()

我对类一无所知,但我真的很想知道如何创建自己的函数/方法以保持代码整洁。

4

3 回答 3

2

好的,这是因为您在某些情况下使用静态字段而在其他情况下不使用。有大量关于静态类/成员的论文,例如,请参见此处。

如果您在使用时使用该类,则不会调用初始化代码。

在您的情况下,您应该有一个 DBConnect 实例并删除staticfrom 方法

var db = new DBConnect();

然后使用它来进行查询:

db.Count(...);

另一种解决方案是在Initialize方法内部调用Count方法。您应该修改Initialize以使其成为static(您必须将所有字段设置为static

于 2012-12-18T11:09:59.140 回答
1

其他用户将适当地回答这个问题。所以我想提一些不同的东西。你的代码不是很好。您可以查看存储库模式的使用,而不是使用它。您还可以将 petapoco 用于数据库。这些有助于您的工作。

http://www.remondo.net/repository-pattern-example-csharp/

http://www.toptensoftware.com/petapoco/

于 2012-12-18T11:13:59.163 回答
1

您的myCon对象在方法中初始化,该Initialize()方法在类的构造函数中调用,因此仅当您创建DbConnect.

mycon = new MySqlConnection(connectionString);

在您的代码中,您没有 的实例DbConnect,您只需调用Count该类的静态方法。所以,myCon就是null

于 2012-12-18T11:15:45.990 回答