如何从 C# 连接到 SQL 数据库?

Posted

技术标签:

【中文标题】如何从 C# 连接到 SQL 数据库?【英文标题】:How do I connect to a SQL database from C#? 【发布时间】:2010-11-23 15:34:59 【问题描述】:

我正在尝试为我的家庭网络编写本地程序管理和安装系统,并且我认为我已经掌握了技术:

用于客户端的 C#/.NET/WPF Lua 用于安装脚本支持(通过 LuaInterface) 用于维护程序数据库的 SQL Server Express

但是我不确定我将使用什么来将 C# 连接到数据库。 .NET 框架中是否为此内置了一些东西?如果您对我应该使用什么来与所述数据库进行交互有任何建议,则可以加分。

【问题讨论】:

【参考方案1】:

看看

Introduction to ADO.NET Tutorial ADO.NET Tutorial Lesson 1 An introduction to ADO.NET

我相信还有更多内容 - 只需在 Google 上搜索“ADO.NET”和“Tutorial”......

更新:

如果您想连接到本地 SQL Server Express,并连接到“Northwind”数据库,并从“客户”表中读取前 5 位客户,则必须执行以下操作:

string connectionString = "server=(local)\SQLExpress;database=Northwind;integrated Security=SSPI;";

using(SqlConnection _con = new SqlConnection(connectionString))

   string queryStatement = "SELECT TOP 5 * FROM dbo.Customers ORDER BY CustomerID";

   using(SqlCommand _cmd = new SqlCommand(queryStatement, _con))
   
      DataTable customerTable = new DataTable("Top5Customers");

      SqlDataAdapter _dap = new SqlDataAdapter(_cmd);

      _con.Open();
      _dap.Fill(customerTable);
      _con.Close();

   

现在您将在 DataTable 中拥有来自 Northwind 数据库的所有 5 位***客户,您可以检查、打印、操作它们 - 任何您想做的事情。

这就是 ADO.NET 的实际应用!

关于连接字符串的详细信息 - 您可以使用哪些选项以及它应该是什么样子,请查看 Connection Strings 网站 - 它有大量示例和解释。

马克

【讨论】:

嗯,这听起来像是一个愚蠢的问题,但 ADO.NET 与我的问题有什么关系? ADO.NET 是从 C# 或 VB.NET 连接到 SQL Server、SQL SErver Express、Oracle 等数据库的 .NET 子系统 好的,我如何使用 LINQ to SQL 或类似的? LINQ-to-SQL 构建在 ADO.NET 之上 - 如果您首先学习 ADO.NET 的基础知识,就不会“浪费”任何东西,一旦您了解了这一点,就可以继续学习 LINQ -to-SQL 或实体框架。【参考方案2】:

SqlConnection

对象就是为此而生的。

例如:

SqlConnection conn = new SqlConnection(
    "Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI"); 

SqlConnection conn = new SqlConnection(
"Data Source=DatabaseServer; Initial Catalog=Northwind; User ID=YourUserID; Password=YourPassword");

conn.Open(); // opens the database connection

编辑:

完成所有操作后,您必须关闭连接

conn.Close();

数据源:标识服务器。可以是本地机器、机器域名或 IP 地址。

初始目录:数据库名称。

集成安全:设置为 SSPI 以与用户的 Windows 登录建立连接

用户 ID:在 SQL Server 中配置的用户名。

密码:与 SQL Server 用户 ID 匹配的密码。

【讨论】:

+1 来自“无评论的反对票”收件人。这个答案没有任何不正确或无用的地方。 [免责声明:我没有投反对票] 我如何使用实体框架或 Linq to SQL? 哈哈。有点牵强,但现在应该有人进来并反对只是打开和关闭连接而不实际对其进行操作。只有在足够多的人想知道为什么哦为什么......【参考方案3】:

要连接到 SQL Server Express,您只需要 System.Data,它是一个标准的 .NET 程序集。只需使用SqlXXX 类就可以了。

但是,编写普通的 ADO.NET 代码非常无聊,因此使用 ORM 或重量较轻的结果集映射器(例如 BLToolkit)非常常见。

最后,考虑使用 SQL Server CE。这是一个完全符合 ACID 的单文件嵌入式数据库引擎,它支持几乎所有您可以从 SQL RDBMS 中获得的功能。

【讨论】:

【参考方案4】:

您可以使用相同的 ADO.Net 和 System.Data.SqlClient 命名空间。我会建议您使用实体框架(ORM)。请在下面找到有关实体框架演练的链接

http://thedatafarm.com/LearnEntityFramework/tutorials/creating-an-ado-net-entity-framework-entity-data-model/

http://thedatafarm.com/LearnEntityFramework/tutorials/use-an-entity-framework-entity-as-a-winforms-data-source/

【讨论】:

处理使用对象作为数据库的问题,我为此设置了一个 SQL Server Express 实例。 EF 对于一个非常小的初学者样本来说似乎有点矫枉过正......在我看来,这会使事情变得不必要地复杂化。首先了解基本 ADO.NET 的基础知识! 我同意 marc_s。首先学习基础知识总是好的,我认为这也不会花费太多时间(对于 ADO.Net)【参考方案5】:

我建议使用Microsoft's Patterns & Practices Enterprise Library。您将专门使用The Data Access Application Block。

摘自 MSDN:

数据访问应用程序块 提供以下好处:

它使用了 ADO.NET 2.0 提供的功能,有了它,您可以 使用 ADO.NET 功能以及 应用程序块的功能。 它减少了编写样板代码来执行标准的需要 任务。 它有助于保持一致的数据访问实践,无论是在一个 应用程序和整个企业。 它减少了更改数据库类型的困难。 它使开发人员无需学习不同的编程模型 针对不同类型的数据库。 它减少了开发人员在移植时必须编写的代码量 应用于不同类型的 数据库。

我多年来一直使用这种方法,到目前为止它非常成功。祝你好运!

【讨论】:

【参考方案6】:

我希望这会有所帮助 试试这些吧。。

@类

using System.Data;
using System.Data.SqlClient;

namespace WindowsFormsApplication2

class clsDB

    public SqlDataAdapter mDataAdapter = new SqlDataAdapter();
    public DataSet mDataSet = new DataSet();
    public SqlConnection mConn;

    public clsDB()
    
        mConn = new SqlConnection("Data Source=(the data source);Initial Catalog=sample;User ID=(the id);Password=(the password)");
    



    public void SQLDB(string strSQL)
    
        try
        
            mDataAdapter = new SqlDataAdapter(new SqlCommand(strSQL, mConn));
            mDataSet = new DataSet();
            mDataAdapter.Fill(mDataSet);

        
        catch (Exception ex)
        
            throw ex;
        
        finally
        
            mConn.Close();
        

    

    public void ClearRes()
    
        mDataAdapter.Dispose();
        mDataAdapter = null;
        mDataSet.Dispose();
        if (mConn.State != ConnectionState.Closed)
        
            mConn.Close();

        

    



@登录

public partial class Login : Form

    clsDB x = new clsDB();

    public Login()
    
        InitializeComponent();
    

    private void btnSubmit_Click(object sender, EventArgs e)
    
            x.SQLDB("select * from tbl_accounts where u_username ='" + txtUser.Text + "' and u_password ='" + txtPass.Text + "'");
            if (x.mDataSet.Tables[0].Rows.Count > 0)
            
                Main a = new Main();
                this.Hide();
                a.Show();
            
            else
            
                MessageBox.Show("wrong username or password");
            
    

@主访问权限

namespace WindowsFormsApplication2

public partial class Main : Form

    clsDB x = new clsDB();

    public Main()
    
        InitializeComponent();
    

    private void btnAdd_Click(object sender, EventArgs e)
    
        x.SQLDB("insert into tbl_info (u_lastname, u_firstname, u_middlename) values ('" + atxtLN.Text + "','" + atxtFN.Text + "','" + atxtFN.Text + "')");
        fillgrid();
    

    private void Main_Load(object sender, EventArgs e)
    
        x.SQLDB(" select * from tbl_info ");
        dgv1.DataSource = x.mDataSet.Tables[0];
        fillgrid();
    
    void fillgrid()
    
        x.SQLDB("select * from tbl_info");
        dgv1.DataSource = null;
        dgv1.DataSource = x.mDataSet.Tables[0];
    
    void search()
    
        x.SQLDB("SELECT * from tbl_info where u_id  like '" + etxtID.Text + "%' order by u_id");
        if (x.mDataSet.Tables[0].Rows.Count > 0)
        
            x.mDataAdapter.Fill(x.mDataSet, "tbl_info");
            dgv1.DataSource = x.mDataSet.Tables["tbl_info"].DefaultView;

            etxtLN.Text = dgv1.Rows[dgv1.CurrentRow.Index].Cells["u_lastname"].Value.ToString();
            etxtFN.Text = dgv1.Rows[dgv1.CurrentRow.Index].Cells["u_firstname"].Value.ToString();
            etxtMN.Text = dgv1.Rows[dgv1.CurrentRow.Index].Cells["u_middlename"].Value.ToString();
        
        else if (etxtID.Text == "Type User ID to Edit")
        
            etxtLN.Text = "";
            etxtFN.Text = "";
            etxtMN.Text = "";
        
        else
        
            etxtLN.Text = "";
            etxtFN.Text = "";
            etxtMN.Text = "";
        
    
    private void etxtID_TextChanged(object sender, EventArgs e)
    

    

    private void etxtID_Enter(object sender, EventArgs e)
    
        etxtID.Text = "";
        etxtID.ForeColor = Color.Black;
    

    private void etxtID_Leave(object sender, EventArgs e)
    
        if (etxtID.Text == "")
        
            etxtID.ForeColor = Color.Gray;
            etxtID.Text = "Type User ID to Edit";

            x.SQLDB(" select * from tbl_info ");
            dgv1.DataSource = x.mDataSet.Tables[0];
            fillgrid();
        
    

    private void etxtID_KeyUp(object sender, KeyEventArgs e)
    
        search();
    

    private void btnUpdate_Click(object sender, EventArgs e)
    
        x.SQLDB("UPDATE tbl_info set u_lastname ='" + etxtLN.Text + "', u_firstname ='" + etxtFN.Text + "', u_middlename ='" + etxtMN.Text + "' where u_id =" + etxtID.Text);
        MessageBox.Show("Operation Successful!");
        fillgrid();
    

    private void btnDelete_Click(object sender, EventArgs e)
    
        x.SQLDB("delete from tbl_info where u_id =" + dtxtID.Text + "");
        MessageBox.Show("Operation Successful!");
        fillgrid();
    


【讨论】:

【参考方案7】:

目前连接到数据库并在 C# 中执行查询的最简单方法是 LinqToSQL。与使用“老式”ADO 连接相比,它会为您省去很多麻烦。

【讨论】:

【参考方案8】:

当然,您可以只使用 System.Data.SqlClient 中的类,尽管大多数人会使用 ORM。我用LLBLGen Pro。

【讨论】:

【参考方案9】:

您可以使用https://github.com/MohamadParsa/AdoDbConnection.Net 并将该项目用作解决方案中的项目参考并享受。此外,您可以探索DBConnection.cs 文件并在项目中复制类或方法。 但是...对于建立连接或断开连接来表达你可以使用:

SqlConnection con = new SqlConnection();
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da = new SqlDataAdapter();
string _ErorrString = "";
string _InternalErorrString = "";
private void Connect()
            
    cmd.Connection = con;
    da.SelectCommand = cmd;
    try
    
        string cs = "";
        cs = @"Data source=.\SQLEXPRESS;Attachdbfilename=|DataDirectory|\" 
        + DataBbaseName + ".mdf;Integrated security=true;user Instance=true";
        con.ConnectionString = cs;
        con.Open();
    
    catch (Exception ex)
    
        _ErorrString += "Erorr NO. : 100" + ", connection error.";
        _InternalErorrString += ex.Message;
    

private void Disconnect()

    con.Close();

并执行命令并获得结果:

public DataSet RunAndGet(string sql)

    //first, make a connection
    Connect();
    //to hold and return results
    DataSet dataSet = new DataSet();
    try
    
        //set command
        cmd.CommandText = sql;
        //run and fill results into the dataset
        da.Fill(dataSet);
    
    catch (Exception ex)
    
        _ErorrString += "Erorr NO. : 101" + ", internal error.";
        _InternalErorrString += ex.Message;

    
    //finally closes connection
    Disconnect();
    return dataSet;

【讨论】:

以上是关于如何从 C# 连接到 SQL 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 连接到 HyperSQL DB

如何使用 C# 和 SQL Server 连接到数据库

连接到 SQL 时,变量似乎无法在 c# 上接收值

C# 以编程方式连接到 SQL 服务器 CE

使用 C# 连接到服务器上的 SQL Server 数据库

c# winform程序怎么连接到本地sqlserver 数据库啊