如何将sql server express数据库连接到VS 2017

时间:2017-03-25 04:57:32

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

我一直在试图从Visual Studio 2017 Express中的c#程序连接到一个小型本地数据库,我在Sql Server Express中创建了一个表。我想在我的解决方案(在c#中)中将它作为数据源连接到实体框架中。我已经搜索了MSDN和这个网站好几天了,但还没有找到解决方法。

现在的问题是,当我浏览实体数据模型向导(现有数据库)并建立新连接时,选择" Microsoft SQL Server数据库文件(SqlClient)"并浏览到我的数据库 - 测试连接生成错误:

  

无法打开物理文件" C:\ Program Files \ Microsoft SQL Server \ MSSQL13.SQLEXPRESS \ MSSQL \ DATA \ MyDatabase.mdf"。   操作系统错误5:" 5(访问被拒绝。)"。   尝试为文件C:\ Program Files \ Microsoft SQL Server \ MSSQL13.SQLEXPRESS \ MSSQL \ DATA \ MyDatabase.mdf附加自动命名的数据库失败。   存在具有相同名称的数据库,或者无法打开指定的文件,或者它位于UNC共享上。

我以管理员身份运行Visual Studio(这已经过了一个先前的问题,甚至不让我浏览到数据库而不会提示我没有获得打开的权限的错误消息数据库文件)。

我可以在Visual Studio中的SQL Server对象资源管理器中查看我的数据库,其表和数据 - 无论我是否以管理员身份运行它。不确定这是否重要。 我对这一切都很陌生,如果我遗漏了一些明显的东西,那就很抱歉。

3 个答案:

答案 0 :(得分:7)

弄清楚我的问题: 在Visual Studio"添加新数据源"向导,我一直选择的选项是" Microsoft SQL Server数据库文件",因为它的描述是"使用此选择将数据库文件附加到本地Microsoft SQL Server实例(包括Microsoft SQL Express)使用适用于SQL Server的.NET Framework数据提供程序。"

但是,我不知道为什么,这不是正确的选择。

我尝试选择"其他"代替。

然后在下一页输入"。\ SQLExpress"作为服务器名称(在connectionstrings.com/sql-server/上提到...感谢领导@ ryguy72!)

然后,在"连接到数据库"弹出我的本地数据库列表,包括我已经使用SSMS创建的数据库。

测试连接终于工作了!

答案 1 :(得分:1)

你看到了吗?

https://www.connectionstrings.com/sql-server/

尝试使用最简单的方案(无安全性)。

服务器= myServerAddress;数据库= MYDATABASE; Trusted_Connection = TRUE;

这是一个C#脚本,它可以访问我机器上的SQL Server数据库。

Excel to DGV:

        private void button1_Click(object sender, EventArgs e)
        {

            DataTable table = new DataTable();
            string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text\"",
            "C:\\Users\\Ryan\\Desktop\\Coding\\DOT.NET\\Samples C#\\Export DataGridView to SQL Server Table\\Import_List.xls");
            using (OleDbConnection dbConnection = new OleDbConnection(strConn))
            {
                using (OleDbDataAdapter dbAdapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", dbConnection)) //rename sheet if required!
                    dbAdapter.Fill(table);
                dataGridView1.DataSource = table;
                int rows = table.Rows.Count;
            }

            dataGridView1.AutoGenerateColumns = false;
            dataGridView1.Columns["FName"].DataPropertyName = table.Columns["FName"].ColumnName;
            dataGridView1.Columns["LName"].DataPropertyName = table.Columns["LName"].ColumnName;
            dataGridView1.Columns["Age"].DataPropertyName = table.Columns["Age"].ColumnName;
            dataGridView1.DataSource = table;

            //IF THE ORDER DOSEN'T MATTER
            //DataTable table = new DataTable();
            //string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text\"", "C:\\Users\\Excel\\Desktop\\Coding\\DOT.NET\\Samples C#\\Export DataGridView to SQL Server Table\\Import_List.xls");
            //using (OleDbConnection dbConnection = new OleDbConnection(strConn))
            //{
            //    using (OleDbDataAdapter dbAdapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", dbConnection)) //rename sheet if required!
            //        dbAdapter.Fill(table);
            //    dataGridView1.DataSource = table;
            //    int rows = table.Rows.Count;
            //}

        }

Excel to SQL Server:

        private void button3_Click(object sender, EventArgs e)
        {
            System.Data.OleDb.OleDbConnection ExcelConnection = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Users\\Excel\\Desktop\\Coding\\DOT.NET\\Samples C#\\Export DataGridView to SQL Server Table\\Import_List.xls;Extended Properties=Excel 8.0;");

            ExcelConnection.Open();

            string expr = "SELECT * FROM [Sheet1$]";
            OleDbCommand objCmdSelect = new OleDbCommand(expr, ExcelConnection);
            OleDbDataReader objDR = null;
            SqlConnection SQLconn = new SqlConnection();
            string ConnString = "Data Source=Excel-PC;Initial Catalog=Northwind.MDF;Trusted_Connection=True;";
            SQLconn.ConnectionString = ConnString;
            SQLconn.Open();

            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(SQLconn))
            {

                bulkCopy.DestinationTableName = "tblTest";

                try
                {
                    objDR = objCmdSelect.ExecuteReader();
                    bulkCopy.WriteToServer(objDR);
                    ExcelConnection.Close();

                    //objDR.Close()
                    SQLconn.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }

        }

再次...... Excel到SQL Server:

private void button4_Click(object sender, EventArgs e)
{
    BindGrid();
}

protected void BindGrid()
{
    string path = "C:\\Users\\Excel\\Desktop\\Coding\\DOT.NET\\Samples C#\\Export DataGridView to SQL Server Table\\Import_List.xls";
    string jet = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0", path);
    OleDbConnection conn = new OleDbConnection(jet);
    OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn);
    DataTable dt = new DataTable();
    da.Fill(dt);

    dataGridView1.DataSource = dt;
    BulkUpload();
}

最后...... DGV到SQL Server:

private void button8_Click(object sender, EventArgs e)
{

    //SqlConnection connection = new SqlConnection("Data Source=Excel-PC;Initial Catalog=Northwind.MDF;Trusted_Connection=True;");
    DataTable dt = (DataTable)dataGridView1.DataSource;
    string connection = "Data Source=Excel-PC;Initial Catalog=Northwind.MDF;Trusted_Connection=True;";
    using (var conn = new SqlConnection(connection))
    {
        conn.Open();
        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
        {
            bulkCopy.ColumnMappings.Add(0, "Fname");
            bulkCopy.ColumnMappings.Add(1, "Lname");
            bulkCopy.ColumnMappings.Add(2, "Age");

            bulkCopy.BatchSize = 10000;
            bulkCopy.DestinationTableName = "Import_List";
            bulkCopy.WriteToServer(dt.CreateDataReader());
        }
    }

}

不要忘记将引用设置在顶部!!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using Excel = Microsoft.Office.Interop.Excel;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Configuration;
using System.Data.SqlClient;

答案 2 :(得分:0)

在标准(无附加配置)安装SQL Express Server之后将仅激活共享内存协议,您可以通过 SQL Server 2014 Configuration Manager enter image description here

进行检查

对于VS的本地连接(测试)就足够了

“ ......从同一台计算机上运行的客户端到Microsoft SQL Server的连接使用共享内存协议。共享内存没有可配置的属性。共享内存始终首先被尝试,并且不能从其顶部移动。 “客户端协议属性”列表中的“已启用协议”列表。可以禁用“共享内存”协议,这在对其他协议之一进行故障排除时非常有用。” docs.microsoft.com

要测试来自VS的连接,可以使用数据连接中的添加连接,数据源=“ MS SQL Server”

enter image description here

主要问题,您必须设置正确的服务器名称(默认情况下不正确)<servername>\<instancename>或别名(localhost\<instancename>.\<instancename>)。在安装SQL Server时设置的实例名称(通常-SQLEXPRESS)。您可以在SQL Server Management Studio中右击“服务器名称”(此程序可以比VS更容易地找到它)。字段“数据库名称”留空,然后简单地按“测试连接”(如果设置正确,必须立即从服务器得到答复)。

P.S> 通过此SQL,您可以检查用于连接的协议:  SELECT net_transport FROM sys.dm_exec_connections WHERE session_id = @@SPID;