Kolla efter parameter i SQL fråga - C#

Permalänk
Medlem

Kolla efter parameter i SQL fråga - C#

Hej

Sitter och grejar lite med ett program i C# som kan köra sparade SQL frågor.

Har googlat runt en del men hittar inget bra sätt att kolla om SQL frågan jag vill köra kräver att en parameter skickas med (Jag som gör frågorna så vet att dom tre som kan komma på tal är FrånDatum, TillDatum och Namn)

Anledningen till att jag vill kunna kolla detta är för att kunna varna om man inte fyllt i tex FrånDatum om det krävs i frågan jag ska köra.

Kör nedan kod för att köra mina frågor.

using (SqlConnection connection = new SqlConnection(connectionString)) using (SqlCommand command = connection.CreateCommand()) { string script = File.ReadAllText(Properties.Settings.Default.SQLFolder + @" + cbRapporter.Text + @.sql", Encoding.GetEncoding("ISO-8859-1")); command.CommandText = script.Replace("GO", ""); SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = command; //Parametrar som kan skickas med i SQL frågorna. command.Parameters.Add(new SqlParameter("@FromDate", from)); command.Parameters.Add(new SqlParameter("@ToDate", to)); command.Parameters.Add(new SqlParameter("@Name", name)); using (DataTable dataTable = new DataTable()) { adapter.Fill(dataTable); this.dgRapporter.DataSource = dataTable; GridRows(); } }

Någon som har en bra idé?

Permalänk
Medlem
Skrivet av Robban_z:

Hej

Sitter och grejar lite med ett program i C# som kan köra sparade SQL frågor.

Har googlat runt en del men hittar inget bra sätt att kolla om SQL frågan jag vill köra kräver att en parameter skickas med (Jag som gör frågorna så vet att dom tre som kan komma på tal är FrånDatum, TillDatum och Namn)

Anledningen till att jag vill kunna kolla detta är för att kunna varna om man inte fyllt i tex FrånDatum om det krävs i frågan jag ska köra.

Kör nedan kod för att köra mina frågor.

using (SqlConnection connection = new SqlConnection(connectionString)) using (SqlCommand command = connection.CreateCommand()) { string script = File.ReadAllText(Properties.Settings.Default.SQLFolder + @" + cbRapporter.Text + @.sql", Encoding.GetEncoding("ISO-8859-1")); command.CommandText = script.Replace("GO", ""); SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = command; //Parametrar som kan skickas med i SQL frågorna. command.Parameters.Add(new SqlParameter("@FromDate", from)); command.Parameters.Add(new SqlParameter("@ToDate", to)); command.Parameters.Add(new SqlParameter("@Name", name)); using (DataTable dataTable = new DataTable()) { adapter.Fill(dataTable); this.dgRapporter.DataSource = dataTable; GridRows(); } }

Någon som har en bra idé?

Du verkar ju inkludera en fil med din fråga i. Det är ju bara att parsa den vilka parametrar som finns (Typ räkna antalet @ eller nåt).

Visa signatur

Jag är en optimist; det är aldrig så dåligt så att det inte kan bli sämre.

Permalänk
Medlem
Skrivet av zyberzero:

Du verkar ju inkludera en fil med din fråga i. Det är ju bara att parsa den vilka parametrar som finns (Typ räkna antalet @ eller nåt).

Det stämmer, jag loopar igenom en mapp efter alla finamn där jag sparar alla SQL frågor och visar dom i en comboBox.

Sitter mest och hobby programmerar och är inte jätte duktig, har du något exempel?

Permalänk
Medlem

Vet inte om detta är vad du menade och det kanske finns något bättre sätt att göra det på.

if (script.ToString().Contains("@FromDate")) { if (dateTimePickerFrom.Checked == false) { MessageBox.Show("Fyll i från datum"); } }

Permalänk
Medlem

Man bör göra de där kontrollerna innan man skickar in till SQL frågan.

Gör en ny klass som innehåller de olika typerna du behöver:

public class NameDate { public string Name; public DateTime FromDate; public DateTime ToDate; }

Sen så skapar du ett nytt objekt av den klassen med en fin metod.

public NameDate GenerateNameDateObjectFromString(string name, string fromdate, string todate) { DateTime FromDate; DateTime ToDate; string name; if(DateTime.TryParse(fromdate, out FromDate), DateTime.TryParse(todate, out ToDate), !string.IsNullOrEmpty(name)) { NameDate theObject = new NameDate(); // Vi bygger en rad i taget så vi kan debugga lättare istället för att returnera/skapa objektet inline theObject.Name = name; theObject.FromDate = FromDate; theObject.ToDate = ToDate; return theObject; } else { return null; } }

Sen tar vi inputet, kör grejrna och skickar ner till databasen

NameDate grejs = GenerateNameDateObjectFromString(bla, ble, blu); UpdateDatabaseWithName(grejs);

Permalänk
Medlem

Sen givetvis innan vi skickar in till metoden som kollar att stringarna är korrekta, kör vi en metod för att hämta upp strängarna, typ som Robban postade.

Man ska aldrig köra data rakt in i databasen, man ska alltid ha ett lager emellan. Det är bra för säkerhet, men också för debugging och läsbarhet.

Ofta den som jobbar i "front end" kan inte påverka kod i "back end" så snubben som chefar över databasen kanske säger: Jag accepterar 2 datetime och 1 string i den här metoden (som är exponerad mot dig), nåt annat vill jag inte ha.

Samma om man har 3 lager. Front end snubben hämtar upp inmatade strängar, kollar att de finns, och skickar sen till andra snubben, som gör om strängar till datetime etc, sen skickas till databas.