2012-08-03 14 views
7

Ho creato una funzione in SQL, ora ho bisogno di usare quella funzione nella mia applicazione C#.Come posso chiamare una funzione SQL in C#?

Ho provato ad utilizzare qualcosa di simile, ma sembra che sto facendo male dal momento che sto ricevendo:

Must declare the scalar value '@2064734117' 

... quando mi danno 2064734117 come primo parametro e 1 come secondo parametro . Ecco il codice di cui sto parlando:

SqlConnection con = new SqlConnection(clsDb.connectionString); 
string query = string.Format("select Function1(@{0},@{1}) ", 
    int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString()),1); 
con.Open(); 
SqlCommand cmd = new SqlCommand(query,con); 
SqlDataAdapter READER = new SqlDataAdapter(); 
READER.SelectCommand = cmd; 
DataTable table = new DataTable(); 
READER.Fill(table); 
radGridView1.DataSource = table; 
con.Close(); 

E la mia funzione accetta due parametri interi e restituisce una tabella. L'ho controllato in Visual Studio e ha funzionato, ma non riuscivo a farlo funzionare nella mia applicazione.

E questa è la mia dichiarazione di funzione:

ALTER FUNCTION dbo.Function1 
(
/* 
@parameter1 int = 5, 
@parameter2 datatype 
*/ 
@ID int, 
@clsTypeID int 
) 
    RETURNS TABLE/* @table_variable TABLE (column1 datatype, column2 datatype) */ 
    AS 
     /*BEGIN */ 
    /* INSERT INTO @table_variable 
     SELECT ... FROM ... */ 
RETURN SELECT * FROM tblCLASS2 
     WHERE STNID = @ID AND CLASSTYPEID = @clsTypeID 
/*END */ 
/*GO*/ 
+1

Cosa errori state ottenendo? Un'altra opzione è scrivere una stored procedure che chiama la tua funzione e chiama semplicemente proc tramite ado.net/c# – kd7

+0

Questo codice dovrebbe funzionare, quale errore sta dando? Si noti che questa funzione non * assomiglia a * una funzione, sarebbe meglio implementata in una 'stored procedure '. Tuttavia, dovrebbe funzionare in entrambi i modi. –

+0

ottengo "Deve dichiarare il valore scalare" @ 2064734117 "". quando do 2064734117 come primo parametro e 1 come secondo parametro. – Breeze

risposta

11

SQL è un po 'fuori, dovrebbe essere:

string query = string.Format("select * from dbo.Function1({0},{1});", int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString()),1); 

Si potrebbe desiderare di utilizzare SqlParameter-oggetti per evitare iniezioni SQL:

string query = "select * from dbo.Function1(@pa1,@par2);"; 
    cmd.Parameters.Add("@par1", SqlDbType.Int).Value = int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString()); 
    cmd.Parameters.Add("@par2", SqlDbType.Int).Value = 1; 
1

si può fare qualcosa di simile:

 myConn.Open(); 

     //generating the new command for our database 
     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "SELECT OBJECTID_1, NDNT as theAddress, MIN(ABS(x - " + double.Parse(x.ToString()) + ") + ABS(y - " + double.Parse(y.ToString()) +")) from dbo.DWH_OUTPUT GROUP BY OBJECTID_1,NDNT HAVING (MIN(ABS(x - " + double.Parse(x.ToString()) + ") + ABS(y - " + double.Parse(y.ToString()) + ")) = (Select MIN(ABS(a.x - " + double.Parse(x.ToString()) + ") + ABS(a.y - " + double.Parse(y.ToString()) + ")) from dbo.DWH_OUTPUT a))"; 
     cmd.Connection = myConn; 

     //getting some more ado.net objects 
     SqlDataAdapter da = new SqlDataAdapter(); 
     DataSet ds = new DataSet(); 

     da.SelectCommand = cmd; 
     da.Fill(ds, @"Addresses"); 

     if (ds.Tables[0].Rows.Count > 0) 
     { 
      theAddress = ds.Tables[0].Rows[0][@"theAddress"] + @" (proximity address)"; 
     } 

     myConn.Close(); 

Si noti come in questo esempio, è possibile impostare CommandType del SqlCommand per CommandType.Text. Specificare i parametri del comando (ad esempio la funzione di selezione nello snippet di codice), quindi compilare il set di dati con il metodo Fill. Quindi puoi estrarre i valori dalle righe come faresti normalmente con ado.net standard.

Se è necessario chiamare una stored procedure, date un'occhiata a questo:

How do I call a TSQL function from ado.net

3

A colpo d'occhio, la prima cosa che posso vedere è che non sta specificando l'oggetto proprietario/schema ; è necessario per le funzioni, quindi dovrebbe essere select dbo.Function1(...

Secondo: guarda che cosa genera la chiamata a string.Format; che sta generando @1 e @n per n un altro intero, ma che non è un nome di parametro valido. Che è utile, perché

Terzo: non è stato aggiunto alcun parametri

Quarto: per un'UDF tavolo (piuttosto che un'UDF scalare), è necessario select * from dbo.Function1(..., non solo select dbo.Function1(...

Problemi correlati