在任何人投票之前,我想说这是我第一次使用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()
?
我对类没有任何了解,但我真的很想知道如何创建自己的函数/方法以保持我的代码整洁。
答案 0 :(得分:2)
好的,这是因为你在某些情况下使用静态字段并且在其他情况下不使用。有大量关于静态类/成员的论文,例如参见here。
如果您正在使用该类,则不会调用初始化代码。
在您的情况下,您应该有一个DBConnect实例并从方法
中删除static
var db = new DBConnect();
然后使用它来进行查询:
db.Count(...);
另一种解决方案是在Initialize
方法中调用Count
方法。您应修改Initialize
以使其static
(您必须将所有字段设为static
)
答案 1 :(得分:1)
另一位用户会回答这个问题。所以我想提一下不同的东西。你的代码不是很好。您可以查看存储库模式的使用,而不是使用它。您也可以使用petapoco作为数据库。这些都有助于您的工作。
答案 2 :(得分:1)
您的myCon
对象在Initialize()
方法中初始化,该方法在类的构造函数中调用,因此只有在您创建DbConnect
的实例时才会这样。
mycon = new MySqlConnection(connectionString);
在您的代码中,您没有DbConnect
的实例,只需调用该类的静态方法Count
即可。因此,myCon
为null
。