Visual Studio 2017 Expressのc#プログラムから、SQL Server Expressで作成した1つのテーブルを持つ小さなローカルデータベースに接続しようとすると、問題が発生し続けます。私のソリューション(c#にあります)のEntity Framework内のデータソースとして接続したいと思います。 MSDNとこのサイトを数日間検索しましたが、これを解決する方法が見つかりませんでした。
問題は、エンティティデータモデルWizard(既存のデータベース)を通過して新しい接続を確立するときに、「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オブジェクトエクスプローラーでデータベース、そのテーブル、およびそのデータを表示できます。それが重要かどうかわかりません。私はこれらすべてに慣れていないので、明らかな何かを見逃してすみません。
私の問題を理解しました:Visual Studioの「新しいデータソースの追加」ウィザードで、選択したオプションは「Microsoft SQL Serverデータベースファイル」でした。 (Microsoft SQL Expressを含む).NET Framework Data Provider for SQL Serverを使用します。」
しかし、なぜこれが正しい選択ではなかったかはわかりません。
代わりに「その他」を選択してみました。
次に、次のページで、サーバー名として「。\ SQLExpress」と入力します(connectionstrings.com/sql-server/に記載...リード@ ryguy72をありがとう!)
次に、「データベースへの接続」の下に、SSMSを使用して既に作成したものを含む、データベースのローカルリストが表示されました。
テスト接続がついに機能しました!
ここを見ましたか?
https://www.connectionstrings.com/sql-server/
最も簡単なシナリオ(セキュリティなし)で試してください。
Server = myServerAddress; Database = myDataBase; Trusted_Connection = True;
これが、私のマシンのSQL Server DBにヒットする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;