繁体   English   中英

如何创建具有SQL连接和查询功能的类并将其调用到Windows窗体按钮?

[英]How do I create a class with SQL connection and query functions and calling it to my windows form buttons?

我想创建一个具有SQL连接和功能(如插入,选择,删除查询)的类,并希望将其调用到表单(按钮等)中。

我不知道是否有可能或者这样做有一些方法...

我已经做了一些研究,并在类SQL连接上提出了这段代码,但不确定是否正确。

提前非常感谢您。 我是一个初学者,想了解有关C#的更多信息。

任何类型的响应表示赞赏。 谢谢

对不起,我的英语不好

using System.Data.SqlClient;

   class SqlConnClass
{
    public static SqlConnection GetConnection()
    {
        string str = "Data Source=localhost;Initial Catalog=kwem;Integrated Security=True;";

        SqlConnection conn = new SqlConnection(str);
        conn.Open();
        return conn;
    }

你近了! 您可能想从您的方法中删除“ conn.Open()”,因为您可以为查询打开它。 (请记住将其关闭或放入using语句中!)

public static void UpdateDB(string valToUpdate)
{
    SQLConnection conn = GetConnection();
    using (conn)
    {
    SQLCommand updateCommand = new SQLCommand(GetConnection(), "Update Table 
    Set Val = @newValue");
    updateCommand.Parameters.AddWithValue("@newValue", valToUpdate);
    conn.Open();
    updateCommand.ExecuteNonQuery();
    }
}

然后,您将对任何其他种类的DB函数执行相同的操作。

没错,但是; 如果您的字符串str不起作用。 请尝试以下方法:

string str = "Data Source=local host ;Initial Catalog=kwem;Integrated Security=True"

另外,您需要定义sql表,然后选择数据库。

您走在正确的道路上。
您所指的是数据访问层,简称DAL。
它是n层体系结构模型的一部分 (在简单版本中,分为3层-表示层,业务逻辑和数据访问层)。

基本概念是将表示,逻辑和数据分为应用程序的3个不同部分。
至于数据访问层,通常会有一个静态或单例类负责将业务层连接到数据。 此类将包含CRUD操作的方法-创建,读取,更新和删除数据。 您将需要为每个操作和每个数据实体创建方法。

我一直看到的一种方法是:

public static class DAL
{
    private static string _ConnectionString = null;
    static DAL() // A static constructor to initialize the connection string
    {
        _ConnectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
    }
    public static DataSet GetCategories()
    {
        var ds = new DataSet();
        var sql = "SELECT * FROM Categories";
        using (var con = new SqlConnection(_ConnectionString))
        {
            using (var cmd = new SqlCommand(sql, con))
            {
                using (var adapter = new SqlDataAdapter(cmd))
                {
                    adapter.Fill(ds);
                }
            }
        }
        return ds;
    }

    public static int DeleteCategory(int categoryId)
    {
        int rowsEffected = 0;
        var sql = "DELETE FROM Categories WHERE Id = @Id";
        using (var con = new SqlConnection(_ConnectionString))
        {
            using (var cmd = new SqlCommand(sql, con))
            {
                cmd.Parameters.Add("@Id", SqlDbType.Int).Value = categoryId;
                con.Open();
                cmd.ExecuteNonQuery();
            }
        }
        return rowsEffected;
    }
}

等等。 如您所见,有很多重复的代码。
这意味着需要更长的代码,更广泛的维护,并且如果由于某种原因您将要支持其他类型的数据库(例如迁移到MySql,Oracle或其他数据库),则必须非常努力地更改DAL中所有特定于供应商的类( SqlConnection,SqlCommand等)。

这些问题正是我编写ADONETHelper的原因。 我已经使用了几年(大多数情况下是以不同的形式使用),现在我感觉它已经成熟到可以公开发行的地步。 它目前已获得MIT许可,这是完全免费的,您可以下载副本并根据需要进行更改。
如果您选择使用它,则您的DAL类可能看起来像这样:

public static class DAL
{
    private static IDBHelper _DB;
    static DAL() // A static constructor to initialize _DB
    {
         // initialize connection string from config file
        var connectionstring = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
        _DB = DBHelperFactory.GetInstance(DataBaseType.SQLServer, connectionstring);
    }

    public static DataSet GetCategories()
    {
        var sql = "SELECT * FROM Categories";
        return _DB.FillDataSet(sql, CommandType.Text);
    }

    public static int DeleteCategory(int categoryId)
    {
        var sql = "DELETE FROM Categories WHERE Id = @Id";
        var param = _DB.CreateParameter("@Id", ADONETType.Int, categoryId);
        return _DB.ExecuteNonQuery(sql, CommandType.Text, param);
    }
}

如您所见,代码重复降至最低限度,并且迁移到其他数据库就像更改静态构造函数以使用其他DataBaseType一样简单。 当然,如果您使用的是特定于供应商的sql,则也必须更改它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM