与SQL Server的表单连接

约翰·塞

活跃成员
已加入
2019年6月17日
留言内容
27
编程经验
5-10
你好,

有人可以提供一些代码示例来帮助我将C#表单连接到受信任的SQL Server(没有用户名或密码,只有服务器名和数据库名)。

谢谢
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
I am going to use MySQL as an example, since I don't have SQL installed. However, if you're set on using SQL, just remove My from 的MySQL 和It should work for SQL providing you use a connection string built for SQL server with your own credentials. This example code was pulled from a static class in a working MySQL project. For your sanity, I will remove the static modifiers and the classes, and assume you know how to structure the code yourself in a custom database class.

您的连接字符串看起来 相似的 到这个::
C#:
public const string cString = "server=localhost;user id=root;password=root;persistsecurityinfo=True;database=visuals_db;port=8889";

我认为连接字符串是不言自明的,因此,我将不再赘述。可以说您可以在ConnectionStrings.Com上进行比较- 的MySQL - SQL服务器 -注意与SQL的区别,您需要限定SQL安装的实例名称,就像MySQL可以提供服务器地址一样。

为了开始执行语句,您将需要一些类似于以下内容的::
C#:
        public const string execSelectUnameQuery = "SELECT username from users WHERE [email protected]";
        public const string execSelectIDQuery = "SELECT id from users WHERE [email protected]";
        public const string execUpdateNameQuery = "UPDATE users SET [email protected] WHERE [email protected] AND [email protected];";
        public const string execInsertUserQuery = "INSERT INTO users (name,username,email,password) VALUES (@Fname,@Uname,@Email,@Pass)";
        public const string execDeleteUserQuery = "DELETE FROM users WHERE [email protected]";
下一步,它使用连接字符串::声明连接:
C#:
public MySqlConnection Con = new MySqlConnection(cString);

然后,您将需要建立一种执行语句的方法。我更喜欢将我的声明传递给该方法。至此,您正在处理伪代码,正如我所解释的,我已经从一个正在运行的项目中撤出了代码。您可以将它们重新拼在一起。
C#:
        //The insert method :: Each method takes one argument, this will be the statement declared above. Just pass in the variable name for the insert statement.
        public bool Insert(string Statement)
        {
            try //Do not nest try catch blocks, except, declare more than one catch exception in one try block. Each catch can be added for the different exceptions that may arise.
            {
                if (Con != null)
                //Check connection reachable and open it if its closed.
                {
                    DoConnection(); //While the connection is closed, open it
                    using (MySqlCommand cmd = new MySqlCommand(Statement, Con)) //Build the command, and pass in the statement with the connection.
                    {    /* Use using blocks for they are self disposing when done using.
                        The below parameters takes the parameter name, and then the value of that parameter
                        So for the first parameter, we are setting the Name of the person for Fname parameter name */
                        cmd.Parameters.AddWithValue("@Fname", myAccount.Name); //Where myAccount would be the class holding your clients user details
                        cmd.Parameters.AddWithValue("@Uname", myAccount.Username);
                        cmd.Parameters.AddWithValue("@Email", myAccount.Email);
                        cmd.Parameters.AddWithValue("@Pass", myAccount.Password);
                        //Notice Fname, Uname, Email, Pass are the placeholders for the values and they are found in the executing statement above. This is how parameters should be used or you risk [URL='//en.wikipedia.org/wiki/SQL_injection']SQL Injection[/URL] attacks.
                        //Always use parameterized command queries!! And use add with value since add is deprecated
                        cmd.ExecuteNonQuery(); //Execute the query
                    }
                    DoConnection(); //Close the connection.
                    return true; //Tell the calling code success
                }
                return false; //Statement wont execute
            }
            catch (Exception ex)
            {   //Then catch all errors you might miss
                MessageBox.Show(string.Concat("Tell the developer there is an error at ", ex.StackTrace));
                return false;
            }
I prefer to handle my open connections with a switch. DoConnection() method being called above opens and closes the connection based on its state.
C#:
        public bool DoConnection() //Open and close the connection with this method
        {
            //We devised a switch statement to open and close the connection depending on its current state
            switch (Con.State == ConnectionState.Closed)
            {
                case true:
                    Con.Open();
                    return true;

                case false:
                    Con.Close();
                    return false;
            }
            return false;
        }
您将需要使它自己工作。您的数据库表应如下所示:

548


如果要使用“选择/删除”查询,则需要在表中添加一个ID字段并将其设置为AI。通常,我不会在没有看到您首先尝试的内容的情况下提供任何代码。简而言之,它应该看起来像这样。如果您有任何疑问,请务必回传自己的实施示例。希望能帮助到你。
 
Last edited:

约翰·塞

活跃成员
已加入
2019年6月17日
留言内容
27
编程经验
5-10
您能否提供一个简单的代码,使用C#连接到受信任的数据库,而无需输入密码,而只需输入服务器名和数据库名?我仍然在看你的代码。谢谢
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
恩,我给你的就是那样。我本来很难,只给你 这个连结和told you to work it out; given you've shown no attempt yourself. You should study what you were given. The answers are on my 邮政 。查看连接字符串的链接,并根据需要设置它们(使用或不使用密码)。
 

约翰·塞

活跃成员
已加入
2019年6月17日
留言内容
27
编程经验
5-10
恩,我给你的就是那样。我本来很难,只给你 这个连结和told you to work it out; given you've shown no attempt yourself. You should study what you were given. The answers are on my 邮政 。查看连接字符串的链接,并根据需要设置它们(使用或不使用密码)。

羊皮,您的连接具有用户名和密码。我的没有用户名或密码,是Trusted Connection。仅仅因为您的工作并不意味着如果我遵循我的意愿,它就具有某些独特性。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
如果您按照我给您的指示进行操作,它将起作用。我对如何做非常有描述性。关于受信任的连接,请参阅Skydiver的以上文章。

我以前曾向很多人提供过此建议,但他们从来没有遇到过任何问题。试一试,如果卡住,请发回。
 

约翰·塞

活跃成员
已加入
2019年6月17日
留言内容
27
编程经验
5-10
我有这个代码问题。它总是卡在conn.Open上并显示消息-类型的未处理异常"System.Data.SqlClient.SqlException发生在System.Data.dll中。你有什么建议。我没有将其更改为您尚未拥有的。



C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data.Odbc;

namespace WFA61719
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server= xyz; Database = DatabaseName; Integrated Security = SSPI");
            conn.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = "SELECT count(*) FROM table";
            string record = cmd.ExecuteScalar().ToString();
            MessageBox.Show("Total records : " + record);
            conn.Close();
        }
    }
}
 
由主持人最后编辑:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,604
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果您在Visual Studio中运行代码,请单击"将异常详细信息复制到剪贴板"然后回复此线程并粘贴内容。异常的Message属性通常具有有关引发异常的原因的详细信息。

如果您的服务器名称或数据库名称中包含空格,则必须在连接字符串中用引号引起来。我认为您的使用"xyz" and "DatabaseName"上面只是为了使您的真实服务器和数据库名称匿名,以便在论坛上发布。
 

约翰·塞

活跃成员
已加入
2019年6月17日
留言内容
27
编程经验
5-10
我看到的确切错误消息:

SqlException未处理

System.Data.dll中发生类型为'System.Data.SqlClient.SqlException'的未处理的异常

附加信息:建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称正确,并且已将SQL Server配置为允许远程连接。 (提供者:TCP提供程序,错误:0-在dtabase查找期间发生了不可恢复的错误。)
 

JuggaloBrotha

工作人员
已加入
2011年4月23日
留言内容
177
地点
密歇根州兰辛;美国
编程经验
10+
我看到的确切错误消息:

SqlException未处理

System.Data.dll中发生类型为'System.Data.SqlClient.SqlException'的未处理的异常

附加信息:建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称正确,并且已将SQL Server配置为允许远程连接。 (提供者:TCP提供程序,错误:0-在dtabase查找期间发生了不可恢复的错误。)
该错误消息告诉您确切的问题:连接字符串指定的sql server不存在。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
发布您的连接字符串。

然后浏览计算机管理(右键单击我的计算机,然后进行管理。)您将看到以下屏幕。浏览服务应用程序数据树。就像我做的一样。您将在其中找到实例名称。安装实例时,您应该知道实例名称,因为SQL安装程序会要求您为其命名。

550
 

约翰·塞

活跃成员
已加入
2019年6月17日
留言内容
27
编程经验
5-10
经过进一步调查,异常细节到剪贴板。

我注意到是
ErrorCode = -2146232060,

类似于此链接的错误消息:
错误消息除外:在数据库查找期间发生了不可恢复的错误

我在某处读到说

原因是环境的SQL Server使用错误的排序规则设置构建。设计器要求排序规则设置不区分大小写(Latin1_General_CI_AS),但是服务器已配置为区分大小写(Latin1_General_CS_AS)。

解决方案是,使用排序规则设置“ Latin1_General_C1_AS”重新安装或安装SQL Server的新实例。
请指教 !谢谢
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,604
地点
弗吉尼亚州切萨皮克
编程经验
10+
您是说VB.NET吗?
.NET是一个基于各种语言的框架,例如C#,VB.NET,F#,IronPython等。

发布您在VB.NET中使用的连接字符串以及在C#中使用的连接字符串。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
我没有重复自己的习惯,所以我会要求最后一次。您当前使用的连接字符串是什么?

请把它和您的SQL服务管理部分的屏幕快照一起发布?就像我在上面所做的一样。

您遇到的错误正直指您自己的问题,而在我在论坛上针对该问题回答的90%主题中,它始终是用户错误,错误地为其连接字符串提供了详细信息。另外,请阅读此内容以解决您的问题,因为如果您不完全了解所要求的信息,那么如果您没有提供我所要求的信息,我们可以提供更多帮助。如果您更愿意单独使用它,也将为您提供帮助。 //social.technet.microsoft.co...ecting-to-the-sql-server-database-engine.aspx
 

约翰·塞

活跃成员
已加入
2019年6月17日
留言内容
27
编程经验
5-10
Did you mean VB.NET?
.NET是一个基于各种语言的框架,例如C#,VB.NET,F#,IronPython等。

发布您在VB.NET中使用的连接字符串以及在C#中使用的连接字符串。


是的,它是VB.NET。除了VB.NET连接之外,我还可以连接其他各种语言,例如R。
我想我只有服务器名称,却没有实例名称。

使用VB.NET连接-
VB.NET:
           mC = New SqlConnection("Initial Catalog = dbName; Data Source = Server; Integrated Security = SSPI;")
           Cmd = mC.CreateCommand
           Cmd.CommandText = "SELECT * FROM table"
           mC.Open()
           myReader = Cmd.ExecuteReader()

使用C#连接-
我尝试了多种方法,这就是其中一种。它总是卡在sqlda.Fill(dtbl);上。
请指教 !

C#:
         SqlConnection sqlCon = new SqlConnection(@"Data Source = Server;Initial Catalog= dbName;Integrated Security = True;");
         SqlDataAdapter sqlda = new SqlDataAdapter("SELECT * FROM table", sqlCon);
         DataTable dtbl = New DataTable();
         sqlda.Fill(dtbl);
         Foreach(DataRow row in dtbl.Rows)
         {
                       Console.WriteLine(row["col1"]);
         }
         Console.ReadKey();
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;
您发布的是ce。不信任您声称的使用方式。
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,604
地点
弗吉尼亚州切萨皮克
编程经验
10+
精确的 您用于VB.NET的连接字符串应适用于C#。您不需要更改任何内容,因为VB.NET和C#都使用相同的SqlConnection类。

恳求您,请发布您正在使用的确切连接字符串,而不是您一直向我们显示的假字符串。
 
最佳 底部