Hej! Några synpunkter : Jag provade ut din kod, och skulle jag få den till att funka så ser det ju mycket frächare ut än min kod. Jag var lite lat och varvade kod som jag skrev ner från minnet med kod som jag kopierade från egna projekt, för att ge dig lite hints men det var inte menat som en komplett lösning. Funktionen GetConnectionString använder jag i kombination med ett formulär som där man kan ange server, databas, NT authentication, SQL login och SQL password, och dessa parametrar skickas in till funktionen GetConnectionString.SQL Engine för mina program(nybörjare)
Jag håller på mycket med SQL i skolan och även på mina praktik platser men är lite less på att behöva skriva connection strings och hela den där raddan.
Så då kommer man förstås upp med idén att man vill ha en klass som tar hand om detta åt en, och här kommer problemen.
Jag vet att man kan kalla på en metod genom att skriva class.method(); så jag tänkte så här.
class Sqlengine
{
public void ADO()
{
SqlConnection Connect = new SqlConnection();
Connect.ConnectionString = "initial Catalog = userdb;" + "Data Surce = localhost";
SqlCommand Command = new SqlCommand();
Command.Connection = Connect;
Command.CommandText = "SELECT * From userlogg";
SqlDataReader Reader = Command.ExecuteReader();
}
public static void Open()
{
Connect.Open();
}
public static void Close()
{
Connect.Close();
}
public static void Read()
{
while (Reader.Read())
{
string firstname = Reader.GetString;
}
}
}
Men det funkar ju inget vidare:/Sv: SQL Engine för mina program(nybörjare)
1. Varför konkatenera delsträngar i onödan? Enda skälet jag kan tänka mig är att radbryta, dvs formatera koden snyggare och det kanske var ditt syfte?
<code>
Connect.ConnectionString = "initial Catalog = userdb;" + "Data Surce = localhost";
Connect.ConnectionString = "initial Catalog = userdb;Data Surce = localhost";
</code>
2. Använd konstruktorerna på de olika klasserna. I stället för att skriva :
<code>
SqlConnection Connect = new SqlConnection();
Connect.ConnectionString = "initial Catalog = userdb;" + "Data Surce = localhost";
</code>
så kan du skriva
<code>
SqlConnection Connect = new SqlConnection("initial Catalog = userdb;Data Surce = localhost");
</code>
och i stället för att skriva :
<code>
SqlCommand Command = new SqlCommand();
Command.Connection = Connect;
Command.CommandText = "SELECT * From userlogg";
</code>
kan du skriva :
<code>
SqlCommand Command = new SqlCommand("SELECT * From userlogg",Connect);
</code>
3. Använd using-keyword:et för klasser som implementerar IDisposable så behöver du inte anropa Dispose-metoder (eller i många fall Close-metoder):
<code>
using (SqlConnection Connect=new SqlConnection(GetConnectionString())
{
Connect.Open();
using (SqlCommand Command = new SqlCommand("SELECT * From userlogg",Connect))
Command.ExecuteNonQuery();
}
</code>
4. Var inte rädd för att öppna och stänga connections hela tiden, det tar connection poolingen hand om såvida du inte stängt av denna i din connectionsträng. Med andra ord, att hålla en connection öppen under hela programmets livstid är normalt sett ingen bra lösning.
Så lite kodexempel :
<code>
class SqlEngineImproved
{
public SqlEngineImproved()
{
}
public static string GetConnectionString(string ServerName, string DataBaseName, string UserName, string Password, bool UseNTAuthentication)
{
System.Text.StringBuilder mString=new System.Text.StringBuilder();
mString.Append("Server=");
if (ServerName=="")
mString.Append("(local");
else
mString.Append(ServerName);
if (UseNTAuthentication)
mString.Append(";Trusted_Connection=True");
else
{
mString.Append(";UID=");
mString.Append(UserName);
mString.Append(";PWD=");
mString.Append(Password);
}
mString.Append(";Database=");
if (DataBaseName=="")
mString.Append("Master");
else
mString.Append(DataBaseName);
mString.Append(";");
return mString.ToString();
}
public static SqlConnection GetConnection()
{
SqlConnection connection=new SqlConnection(GetConnectionString());
connection.Open();
return connection;
}
public static DataSet ExecuteSQL(string SQL)
{
using (SqlConnection connection=new SqlConnection(GetConnectionString()))
{
connection.Open();
using (SqlCommand command=new SqlCommand(SQL,connection))
{
command.CommandType=CommandType.Text;
command.ExecuteNonQuery();
}
}
}
}
</code>Sv:SQL Engine för mina program(nybörjare)
Jag går en utbildning i språket och jag är inte så hemma på det hela än, tyvärr fick jag fel meddelande när jag provade din kodning, den klagade på att din GetConnection sträng och sa att den inte kan ta några overloads:/Sv: SQL Engine för mina program(nybörjare)
Lämpligen sparar man dessa (eller den färdiga connectionsträngen) i statiska variabler under hela applikationens (sessionens) livstid. En överlagrad GetConnectionString utan parametrar skulle alltså kunna hämta den redan sammansatta connectionsträngen.
Lägg till en statisk variabel till klassen:
<code>
string mConnectionString="";
</code>
Sätt sedan denna variabel sist i GetConnectionString (med alla parametrarna):
<code>
mConnectionString=mString.ToString();
// före raden :
return mString.ToString();
</code>
Slutligen skapa en överlagrad funktion utan parametrar :
<code>
public static string GetConnectionString()
{
if (mConnectionString=="")
throw new Exception("Connectionstring not set!");
else
return mConnectionString;
}
</code>
Du måste alltså först anropa GetConnectionString en gång med alla parametrar och därefter kan du återanvända den sparade connectionsträngen genom att anropa GetConnectionString utan parametrar.
Som sagt, min kod var inte på något sätt en komplett lösning men jag hjälper dig gärna vidare om du har någon mer specifik fråga.
Ps. Jag noterade just ett stavfel i din connectionsträng. "Data surce" skall vara "Data Source" kanske var detta ett skäl till att din kod inte fungerade.