如何将SQL Server Express数据库连接到VS 2017

7
我在使用Visual Studio 2017 Express的C#程序连接Sql Server Express上创建的一个只有一张表的小型本地数据库时遇到了问题。我希望将它作为数据源连接到我的解决方案中的Entity Framework(用的是C#)。我已经在MSDN和本站上搜索了好几天,但没能找到解决方法。 现在的问题是,当我通过实体数据模型向导(现有数据库)进行操作并建立新的连接时,选择“Microsoft SQL Server Database File(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 Object Explorer中查看我的数据库、其中的表和数据。不确定是否有所重要。 我对所有这些都很新,请见谅如果我漏掉了一些显而易见的东西。
3个回答

7
找到了我的问题: 在Visual Studio的“添加新数据源”向导中,我一直选择的选项是“Microsoft SQL Server Database File”,因为它的描述是“使用.NET Framework数据提供程序将数据库文件附加到本地Microsoft SQL Server实例(包括Microsoft SQL Express)。” 然而,我不确定为什么,这不是正确的选择。 我尝试选择“其他”。 然后,在下一页中输入“. \ SQLExpress”作为服务器名称(在connectionstrings.com/sql-server/上提到...感谢@ryguy72的帮助!) 然后,在“连接到数据库”下,我的本地数据库列表弹出,包括我已经使用SSMS创建的那个。 测试连接最终成功了!

1

你在这里看了吗?

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

尝试使用最简单的场景(无安全性)进行测试。

服务器=myServerAddress;数据库=myDataBase;Trusted_Connection=True;

这是一个在我的机器上连接SQL Server数据库的C#脚本。

将Excel转换为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转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;

感谢您提供如此详细的答案!我认为各种选项都是基于从一个数据库程序复制数据到另一个数据库程序。在我的情况下,我想使用的表已经正确地填充并且在Sql Server中正确存在...问题只是让我的Visual Studio程序使用VS向导连接到它作为数据源。我也很感激连接字符串链接,我正在查看;这是否意味着我需要使用向导的“Code First”选项来克服错误消息?即使我只是尝试添加新的数据源,错误也会出现。 - Gus Yorke
我遇到了类似的问题。我试图从数据库创建数据源。虽然我可以在SSMS中打开它,但我无法在Visual Studio服务器资源管理器中打开它。数据库连接正常,但在展开表时,它会显示“用户用户名的登录失败”。 我所做的一切就是在连接中将集成安全性值更改为True。这可以通过连接对话框中的高级选项访问。 希望这可以帮助到您。 - Ahmad Tijani

0

标准安装(无添加配置)SQL Express Server只会激活共享内存协议,您可以通过SQL Server 2014配置管理器enter image description here进行检查。

这对于从VS进行本地连接(测试)已经足够了。

"...在同一台计算机上运行的客户端连接到Microsoft SQL Server使用共享内存协议。共享内存没有可配置属性。共享内存总是首先尝试,并且不能从启用的协议列表中的顶部位置移动。当故障排除其他协议时,可以禁用共享内存协议。"learn.microsoft.com

要从VS测试连接,您可以使用Data Connection中的Add Connection,数据源为“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;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接