将VS Project连接到SQL Server

时间:2018-10-29 20:29:41

标签: c# sql-server database visual-studio visual-studio-project

TL; DR,因此您无需保留它: 尽管Visual Studio可以与项目外的服务器进行通信,但Visual Studio不允许我在项目内的SQL服务器上创建与数据库的实时连接。我希望它具有实时连接,以便我可以建立一个使用并允许访问数据库的网站。

我有Visual Studio 2017专业版和Microsoft SQL Server Management Studio 2017。

我已经成功地将数据库从服务器连接到Visual Studio,这样我就可以在Visual Studio中编辑数据库,服务器将反映我的更改。但是,我无法在任何项目中与服务器建立实时连接。当我将数据库导入到项目中时,它只会创建一个实际上不与服务器通信的副本。

我想我需要在Visual Studio中创建某种特殊对象或更改某些设置。

是否需要切换到Enterprise以获得受支持的功能?专业版应该足以解决此问题,但是如果有人知道如何使用其他版本的Visual Studio解决此类问题,或者如何通过另一个[希望负担得起的]程序创建与数据库服务器连接的网站,我全是耳朵。谢谢!

(为清楚起见,稍后添加了此段:)我的目标是使用Visual Studio创建一个网站,该网站允许授权用户编辑数据库。除非这样做是一个可怕的主意,否则我首先要开始使用Visual Studio中的网站在服务器上编辑数据库,然后添加安全功能。服务器上的当前数据库处于占位状态,直到令人满意地设置了系统。听起来好像可以使用网站访问数据库而无需直接将其放入Visual Studio项目中,所以我正在研究第二条注释中提供的指导。

根据@Symon的评论和链接,我管理的错误最少的解决方案如下。我已经为第一行尝试了几项操作,并且由于存在公共无效而导致错误的发生率大约是我尝试过的其他错误的1/30,这绝对不意味着它实际上是正确的答案。出于安全原因,删除了方括号中的项目。我完全按照在弹出窗口中输入的凭据来输入数据库的凭据,以将Visual Studio通常连接到服务器上的数据库。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

public void heresanamespacethingy (string stp)

{
    //GET STORED PROCEDURE HERE
    string conStr = @"Data Source=[server name]; Initial Catalog=[database name]; User ID=[my user ID]; Password=[my password]";

    using (SqlConnection conn = new SqlConnection(conStr))
    {
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        cmd.CommandText = stp;

        conn.Open();

        cmd.CommandType = CommandType.StoredProcedure;

        cmd.ExecuteNonQuery();

        conn.Close();
        conn.Dispose();
   }
}

错误是 CS0116命名空间不能直接包含诸如字段或方法之类的成员。

1 个答案:

答案 0 :(得分:2)

我正在使用VS Community,并且可以与我的MS SQL Server进行交互。您正在使用的Visual Studio版本不会限制您可以在代码方面进行的操作。这些版本仅添加了额外的功能。 我从来没有听说过有人因为他们使用的Visual Studios版本而受到限制。

如@Kfirprods所述,对于使用 Microsoft SQL Server Management Studio 2017 管理服务器/数据库而不是尝试对所有内容使用Visual Studio可能对您很有帮助。

我所见到的最常见的获取实时/当前数据库信息和数据的方法是对实时数据调用C#代码并将其提取。我将在下面有一个C#调用存储过程的示例。 该示例仅调用存储过程,显示了如何使用C#连接到SQL Server和更改数据。您也可以通过此方法发送单个内联查询。但是,为了避免SQL注入(尤其是因为它是一个网站),使用此方法调用存储过程和视图比发送内联查询更好。这是更好的保护。

This可能是一个很好的链接,以供您学习如何开始使用C#连接到SQL Server。这就是我开始使用的东西!

我将我的SQL Server Management Studio连接到服务器/数据库,而Visual Studio只关心我的C#代码。它有助于保持事物的分离性和组织性(无论如何对我而言)。


以下是连接到SQL数据库并运行存储过程的C#方法的示例:

 public void CallSproc(string stp)
 {
        //GET STORED PROCEDURE HERE
        string conStr = "Data Source=" + ConfigurationManager.AppSettings["DataSource"] + "Initial Catalog=" + ConfigurationManager.AppSettings["InitialCatalog"] + "Integrated Security=True;";

        using (SqlConnection conn = new SqlConnection(conStr))
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = stp;

            conn.Open();

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.ExecuteNonQuery();

            conn.Close();
            conn.Dispose();
        }
 }

代码解释:

ConfigurationManager.AppSettings[]指向我的App.config文件和存储此数据的键(标识符)。如果当前服务器丢失,则该程序不需要重新编译。只需更改配置文件即可指向正确的位置。

变量stp是从另一个方法传递的字符串,该方法保存存储过程的名称(例如“ stpAddNumbers”)。

conStr是连接字符串,它告诉SqlConnection()调用要连接到的服务器和数据库。

conn.Open();打开与SQL Server本身的连接。

cmd.CommandType = CommandType.StoredProcedure;告诉代码您正在调用存储过程。

cmd.ExecuteNonQuery();执行存储过程,并返回结果。


CS0116命名空间不能直接包含成员,例如字段或方法:

使用显示的代码和错误消息,您似乎根本没有namespace。要解决此问题,只需将method包裹在namespace中即可。像这样:

...
using System.Threading.Tasks;

namespace HeresANameSpace
{
    class ThisIsAClass
    {
        public void HeresAMethod (string stp)

        {
            //GET STORED PROCEDURE HERE
            string conStr = @"Data Source=[server name]; Initial Catalog=[database name]; User ID=[my user ID]; Password=[my password]";

            using (SqlConnection conn = new SqlConnection(conStr))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = stp;

                conn.Open();

                cmd.CommandType = CommandType.StoredProcedure;

                cmd.ExecuteNonQuery();

                conn.Close();
                conn.Dispose();
           }

            //End of HeresAMethod()
        }

        //End of HeresAClass
    }

    //End of HeresANamespace
}

从空白代码文件开始时,您需要写入namespaceclassmethod s。 method进入class内部,class进入namespace内部。