2009-08-19 15 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 

Làm thế nào tôi có thể gọi một hàm sqlserver từ VB.net (hoặc C#)? Có một số cú pháp như thủ tục lưu trữ?

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

và cuối cùng DataTable dt = dbConn.Execute (CommandType.StoredProcedure, sqlProcName, sqlParams)

Cảm ơn

Trả lời

10

Xin lỗi, không có cách để chạy một hàm trực tiếp. Hoặc gọi nó là sử dụng một bản lệnh sql

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 

Hoặc Quấn một thủ tục vòng nó ...

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

Tôi đã nhận được phiếu giảm giá? – digiguru

+1

Hai ý kiến ​​về điều này: 1 - nó giả định một hàm có giá trị bảng và 2 - Mục đích của sqlParams (1) là gì? Nó dường như không được sử dụng ở bất cứ đâu. Nếu không, rất hữu ích, cảm ơn – JosephStyons

+0

Tôi sẽ sử dụng 'Chọn dbo.MyFunction (@MyParam)' – Jaider

-2

Một trong những điều về chức năng là họ có thể trở lại các loại dữ liệu khác nhau. tôi sử dụng:

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 

đây là một ví dụ về một cuộc gọi:


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

và đây là mã sqlParam tôi:


 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

Có bạn có thể gọi một chức năng trực tiếp như thể hiện dưới đây.

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

Tại sao câu trả lời này là CW? –

+0

Tôi không nghĩ rằng 'ExecuteScalar()' là cần thiết. Tôi đã không có bất kỳ vấn đề bằng cách sử dụng phương pháp này với 'ExecuteNonQuery()'. –

2

này làm việc cho tôi và được dựa trên một trong những câu trả lời ở trên sử dụng một SqlDataAdapter (lưu ý rằng bạn không cần phải sử dụng một) và ExecuteScalar (có thể sử dụng ExecuteNonQuery như trình bày ở đây):

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; 
Các vấn đề liên quan