2009-08-19 7 views
6
Public Sub cleanTables(ByVal prOKDel As Short) 
    Dim sqlParams(1) As SqlParameter 
    Dim sqlProcName As String 
    sqlProcName = "db.dbo.sp_mySP" 
    sqlParams(1) = New SqlParameter("@OKDel", prOKDel) 
    Try 
     dbConn.SetCommandTimeOut(0) 
     dbConn.ExecuteNonQuery(CommandType.StoredProcedure, sqlProcName, sqlParams) 
    Catch ex As Exception 

    Finally 

    End Try 
End Sub 

Czy istniejeJak mogę wywołać funkcję sqlserver z VB.net (lub C#)? Czy jest jakaś składnia jak procedura przechowywana?

CommandType.StoredProcedure...CommandType.Function 
sqlParams(1) = New SqlParameter("@OKDel", prOKDel)... 

i wreszcie DataTable dt = dbConn.Execute (CommandType.StoredProcedure, sqlProcName, sqlParams)

Dzięki

Odpowiedz

10

Niestety, nie ma to sposób na uruchomienie funkcji bezpośrednio. Albo nazywają go przy użyciu polecenia sql Text

Public Sub RunFunction(ByVal input As Short) 
      Using myConnection As New Data.SqlClient.SqlConnection 
       Using myCommand As New Data.SqlClient.SqlCommand("Select dbo.MyFunction(@MyParam)", myConnection) 
        myCommand.CommandType = CommandType.Text 
        myCommand.Parameters.Add(New Data.SqlClient.SqlParameter("@MyParam", input)) 
        myCommand.CommandTimeout = 0 
        Try 
         myCommand.ExecuteNonQuery() 
        Catch ex As Exception 

        End Try 
       End Using 

      End Using 
     End Sub 

lub owinąć wokół niego procedurę ...

Create Procedure RunMyFunction(@MyParam as int) 
Select * FROM dbo.MyFunction(@MyParam) 
Go 
+0

Czy otrzymałem skargę? – digiguru

+1

Dwie uwagi na ten temat: 1 - zakłada funkcję o wartości tabelarycznej i 2 - Jaki jest cel sqlParams (1)? Wydaje się, że nigdzie go nie używa. W przeciwnym razie bardzo pomocne, dzięki – JosephStyons

+0

użyję 'Wybierz dbo.MyFunction (@MyParam)' – Jaider

-2

Jedną z zalet funkcji jest może wrócą różne typy danych. używam:

Friend Function execFunctionReturnsString(ByVal funcName As String, Optional ByVal params As Collection = Nothing) As String 
       Dim cmd As SqlCommand 
       Dim param As SqlParameter 
       Dim sRet As String 
       Dim sCmdText As String 
       Dim iParam As Integer 

    cmd = New SqlCommand 
    sCmdText = "select dbo." & funcName & "(" 
    cmd.CommandType = CommandType.Text 
    cmd.Connection = _sqlConn 
    cmd.CommandTimeout = 0 

    If Not params Is Nothing Then 
     For iParam = 1 To params.Count 
      param = params(iParam) 
      sCmdText = sCmdText & param.Value 
      If iParam < params.Count Then 
       sCmdText = sCmdText & "," 
      End If 
     Next 
    End If 

    sCmdText = sCmdText & ")" 

    cmd.CommandText = sCmdText 
    'If _sqlConn.State <> ConnectionState.Open Then 
    _sqlConn.Open() 
    'End If 
    sRet = cmd.ExecuteScalar() & ""  ' if null 
    _sqlConn.Close() 

    Return sRet 
End Function 

Friend Function execFunctionReturnsInt(ByVal funcName As String, Optional ByVal params As Collection = Nothing) As Integer 
    Dim cmd As SqlCommand 
    Dim param As SqlParameter 
    Dim iRet As Integer 
    Dim sCmdText As String 
    Dim iParam As Integer 

    cmd = New SqlCommand 
    sCmdText = "select dbo." & funcName & "(" 
    cmd.CommandType = CommandType.Text 
    cmd.Connection = _sqlConn 
    cmd.CommandTimeout = 0 

    If Not params Is Nothing Then 
     For iParam = 1 To params.Count 
      param = params(iParam) 
      sCmdText = sCmdText & param.Value 
      If iParam < params.Count Then 
       sCmdText = sCmdText & "," 
      End If 
     Next 
    End If 

    sCmdText = sCmdText & ")" 

    cmd.CommandText = sCmdText 
    'If _sqlConn.State <> ConnectionState.Open Then 
    _sqlConn.Open() 
    'End If 
    iRet = cmd.ExecuteScalar() 
    _sqlConn.Close() 

Return iRet 
End Function 

oto przykładem połączenia:


params = New Collection 
params.Add(SQLClientAccess.instance.sqlParam("@setID", DbType.String, 0, 
     _editListSetID)) 
valGrid.hidePKFields = SQLClientAccess.instance.execFunctionReturnsInt 
     ("udf_hiddenCount", params) 

i tu jest mój kod sqlParam:


 Friend Function sqlParam(ByVal paramName As String, ByVal dBType As System.Data.DbType, ByVal iSize As Integer, ByVal sVal As String) As SqlParameter 
       Dim param As SqlParameter 

    param = New SqlParameter 
    param.ParameterName = paramName 
    param.DbType = dBType 
    param.Size = iSize 
    param.Value = sVal 

    Return param 
    End Function 

HTH

5

Tak można wywołać funkcję bezpośrednio, jak pokazano poniżej.

Dim dtaName As New SqlClient.SqlDataAdapter 

dtaName.SelectCommand = New SqlClient.SqlCommand 
With dtaName.SelectCommand 
    .CommandTimeout = 60 
    .Connection = prvcmpINC.cntINC 
    .CommandType = CommandType.StoredProcedure 
    .CommandText = "dbo.app_GetName" 
    .Parameters.AddWithValue("@ParamToPassIn", parstrParamToPassIn) 
    .Parameters.Add("@intResult", SqlDbType.Int) 
    .Parameters("@intResult").Direction = ParameterDirection.ReturnValue 
End With 

dtaName.SelectCommand.ExecuteScalar() 
intRuleNo = dtaName.SelectCommand.Parameters("@intResult").Value 
+3

Dlaczego jest to odpowiedź CW? –

+0

Nie sądzę, że 'ExecuteScalar()' jest konieczne. Nie miałem żadnych problemów z używaniem tej metody z 'ExecuteNonQuery()'. –

2

To działa na mnie i jest oparta na jednym z powyższych odpowiedzi wykorzystaniem SqlDataAdapter (zauważ, że nie trzeba używać jednego) i ExecuteScalar (można użyć ExecuteNonQuery jak pokazano tutaj):

bool res = false; 
using (SqlConnection conn = new SqlConnection(GetConnectionString())) 
{ 
    using (SqlCommand comm = new SqlCommand("dbo.MyFunction", conn)) 
    { 
     comm.CommandType = CommandType.StoredProcedure; 

     SqlParameter p1 = new SqlParameter("@MyParam", SqlDbType.Int); 
     // You can call the return value parameter anything, .e.g. "@Result". 
     SqlParameter p2 = new SqlParameter("@Result", SqlDbType.Bit); 

     p1.Direction = ParameterDirection.Input; 
     p2.Direction = ParameterDirection.ReturnValue; 

     p1.Value = myParamVal; 

     comm.Parameters.Add(p1); 
     comm.Parameters.Add(p2); 

     conn.Open(); 
     comm.ExecuteNonQuery(); 

     if (p2.Value != DBNull.Value) 
      res = (bool)p2.Value; 
    } 
} 
return res; 
Powiązane problemy