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

VB.net(またはC#)からsqlserver関数を呼び出すにはどうすればよいですか?ストアドプロシージャのような構文がありますか?

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

し、最終的にデータテーブルDT = dbConn.Execute(CommandType.StoredProcedure、sqlProcName、sqlParams)

おかげ

答えて

10

申し訳ありませんが、そこにあるではありません直接関数を実行する方法。 ... 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 

それともラウンド手順をラップを使用して機能に関する事柄の

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

ダウンボトムを取得しましたか? – digiguru

+1

これに関する2つのコメント:1 - テーブル値関数を仮定し、2 - sqlParams(1)の目的は何ですか?それはどこにも使われていないようです。それ以外の場合は非常に役に立ちます。ありがとう – JosephStyons

+0

'dbo.MyFunction(@MyParam)を選択 'を使用します – Jaider

-2

つをそれを呼び出すのいずれか、彼らは異なるデータ型を返すことができます。 私が使用:ここ

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 

は、コールの例です:


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

、ここでは私の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

はい、あなたは、以下に示すよう関数を直接呼び出すことができます。

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

なぜこの回答はCWですか? –

+0

'ExecuteScalar()'は必要ないと思います。私は 'ExecuteNonQuery()'でこのメソッドを使っても問題はありませんでした。 –

2

これは私の作品とSqlDataAdapter(あなたがいずれかを使用する必要がないことに注意)とExecuteScalar(ここに示されているようExecuteNonQueryを使用することができます)を使用して、上記の答えの一つに基づいています。

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; 
関連する問題