JAg håller på med ett lite programm för att kolla lite OleDbSchemaGuid osv. Är ingen stjärna på att koppla sig mot databaser... och definitivt ingen stjärna på sql-server, men där kopplar du dig väl inte mot själva filen utan vad databasen heter? Naturligtvis, man skall ju inte peka på en path utan ett filnamn, så dumt. för att få ut filnamnet kan man använda sig av System.IO.Path.GetFileName(pathenTillFilen); Det betyder ju att SqlCOnnection inte har någon GetOleDbSchema() vilket är rätt logiskt att Sqls driver inte har något OleDbSchema. Är det då rätt att skriva så här: Använder du OLEDB måste du ange providern (har jag för mig) men exempel finns på www.connectionstrings.com Tack Magnus, nu blev det kanonbra.Öppna mdf eller mdb-filer
Jag vill alltså kunna kolla både mdb och mdf.
Jag har dock problem med mdf...
<code>
string exten = filnamn.Substring(filnamn.Length-3,3);
MessageBox.Show(exten);
if(exten=="mdb")
{
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filnamn +";Persist Security Info=False");
con.Open();
}
else if(exten=="mdf")
{
SqlConnection con = new SqlConnection("server=(SAWDATA\\SAWDATA)\\NetSDK;database=" + filnamn +";Trusted_Connection=yes");
con.Open();
}
label1.Text="Öppnad databas: " +filnamn;
System.Data.DataTable dt ;
if(radioButton1.Checked)
{
dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,null);
dataGrid1.DataSource = dt;
}
</code>
Detta ger mig två problem.
1) Min connection med SQL Servern är cass.
2)När variablen con ligger inne i en if-sats får jag följande fel..
<code>
E:\C#-koder\Samples1\Samples1\Form5.cs(227): The type or namespace name 'con' could not be found (are you missing a using directive or an assembly reference?)
</code>
Några förslag för att åtgärda detta?Sv: Öppna mdf eller mdb-filer
Jag har antagit att din server bara heter SAWDATA...
Att du får ditt felmeddelande beror på att con inte längre finns i det scopet. Den du vill använda är väl OleDbConnection con och inte SqlConnection con? Men hur kan programmet se det? Antingen får du använda två olika namn på kopplingarna eller flytta upp den undre if-stasen till den första.
<code>
string exten = Path.GetExtension(filnamn).ToLower();
MessageBox.Show(exten);
System.Data.DataTable dt ;
if(exten==".mdb")
{
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filnamn +";Persist Security Info=False");
con.Open();
if(radioButton1.Checked)
{
dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,null);
dataGrid1.DataSource = dt;
}
}
else if(exten==".mdf")
{
SqlConnection con = new SqlConnection("server=SAWDATA;database=" + Path.GetFileNameWithoutExtension(filnamn) +";Trusted_Connection=true");
con.Open();
}
label1.Text="Öppnad databas: " +filnamn;
</code>
eller förslag 2:
<code>
string exten = Path.GetExtension(filnamn).ToLower();
MessageBox.Show(exten);
System.Data.DataTable dt ;
OleDbConnection accessCon=null;
SqlConnection sqlCon=null;
if(exten==".mdb")
{
accessCon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filnamn +";Persist Security Info=False");
accessCon.Open();
}
else if(exten==".mdf")
{
sqlCon = new SqlConnection("server=SAWDATA;database=" + Path.GetFileNameWithoutExtension(filnamn) +";Trusted_Connection=true");
sqlCon.Open();
}
label1.Text="Öppnad databas: " +filnamn;
if(radioButton1.Checked && accessCon!=null)
{
dt = accessCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,null);
dataGrid1.DataSource = dt;
}
</code>
För connectionstrings kolla även: http://www.connectionstrings.com http://www.connectionstrings.com
En bit på vägen kanske...Sv: Öppna mdf eller mdb-filer
Nu skulle jag alltså splitta upp filnamnet. Detta hittade jag:
<code>
string hela = openFileDialog1.FileName;
string[] delar;
delar = hela.Split('\\');
</code>
Men hur skall jag få tag på enbart filnamnet här?
[REDIGERAT]
Det första problemet är löst:
<code>
string exten = Path.GetExtension(filnamn).ToLower();
string dela=Path.GetFileName(filnamn) ;
string namn = dela.Replace(exten,"");
</code>
Men nu kommer ett annat.
<code>
E:\C#-koder\Samples1\Samples1\Form5.cs(237): 'System.Data.SqlClient.SqlConnection' does not contain a definition for 'GetOleDbSchemaTable'
</code>
Fad jag försöker att göra är, oavset om det är en mdb-fil eller mdf fil så ville jag titta på dem via GetOleDbSchemaTable.
Mdb-filerna är inga problem, därimot mdf.
Jag gjorde föra året en liknande app i VB och det fungerade kanonbr. Tyvärr så förlorade jag alla mina koder vid en krach (utan backup narturligtvis)
Går det att göra såhär?Sv: Öppna mdf eller mdb-filer
Jag vet inte riktigt vad du menar med att man inte skall peka på en path men kolla på länken som inte kom med förut...
Mot en sql-server kopplar man sig väl inte mot filen utan mot "databasen"...
Typ server/dbnamn...Sv: Öppna mdf eller mdb-filer
Men du kan ju använda dig av OleDbConnection mot SqlServern också, och då kommer du få tillgång till denna method.
- MSv: Öppna mdf eller mdb-filer
<code>
SqlConnection con = new OleDbConnection("server=(SAWDATA\\SAWDATA)\\NetSDK;database=" + namn +";Trusted_Connection=yes");
</code>
Servernamnet = SAWDATA\SAWDATA
namn = MelodiStatestikSQL
Är det rätt?Sv: Öppna mdf eller mdb-filer
Där väljer du OleDB och SQL Server.
- MSv: Öppna mdf eller mdb-filer
Dock återstår ett irriterande problem, det med min variabel dt.
Här är hela koden:
<code>
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = "C:\\"
openFileDialog1.Filter = "Access databasfil (*.mdb)|*.mdb|SQL Server filer (*.mdf)|*.mdf" ;
openFileDialog1.Title = "Öppna en databasfil";
openFileDialog1.FilterIndex =1 ;
openFileDialog1.RestoreDirectory = true ;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
string filnamn =openFileDialog1.FileName;
string hela = openFileDialog1.FileName;
label1.Text="Försöker att öppna databasen";
dataGrid1.Refresh();
try
{
string exten = Path.GetExtension(filnamn).ToLower();
string dela=Path.GetFileName(filnamn) ;
string namn = dela.Replace(exten,"");
System.Data.DataTable dt ;
if(exten=="mdb")
{
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filnamn +";Persist Security Info=False");
con.Open();
}
else if(exten=="mdf")
{
OleDbConnection con = new OleDbConnection("Provider=sqloledb;Data Source=SAWDATA\\SAWDATA;Initial Catalog=" + namn +";Integrated Security=SSPI;");
con.Open();
}
label1.Text="Öppnad databas: " +filnamn;
if(radioButton1.Checked)
{
dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,null);
dataGrid1.DataSource = dt;
}if(radioButton2.Checked)
{
dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]{null,null,null,"TABLE"} );
dataGrid1.DataSource = dt;
}
if(radioButton3.Checked)
{
dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Procedures, null );dataGrid1.DataSource = dt;
}if(radioButton4.Checked)
{//Query for getting all primary keys
//OleDbSchemaGuid.Primary_Keys = con.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, null );
// orginal OleDbSchemaGuid.dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, null );
}
if(radioButton5.Checked)
{
dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Provider_Types, null );dataGrid1.DataSource = dt;
}
}
catch(Exception err)
{
MessageBox.Show("Fel:" + err.Message);
}
}
</code>
Om jag gör som föreslagits, då måste jag ju upprepa den nedre if-satsen igen, finns det inget sätt att komma förbi det??