ArcSDE C API在.NET中的调用

 

在.NET中调用API函数C#:
        
using System.Runtime.InteropServices;
[DllImport(
"sde.dll")]//还有其他的属性可参考MSDN
public static extern Int32 SE_connection_create(string server, string instance, string database, string username, string pwd, ref SE_ERROR error, out IntPtr pSdeConn);

VB.NET:
        
Imports System.Runtime.InteropServices
<DllImport("sde.dll", SetLastError:=True, ThrowOnUnmappableChar:=True)> _
Public Shared Function SE_connection_create(ByVal server As StringByVal instance As String,ByVal database As StringByVal username As StringByVal password As StringByRef error1 As SE_ERROR,ByRef connection As IntPtr) As Int32
End Function

        还可以使用Declar关键字来引用API函数,这里就不介绍了。

ArcSDE C API的声明方法
        '--------------↓声明SE_ERROR结构体↓-----------------
        
        <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
        Public Structure SE_ERROR
 
            Public sde_error As Int32
            Public ext_error As Int32
            '<MarshalAs(UnmanagedType.ByValArray, SizeConst:=512)> _
            Public err_msg1 As Char()
            '<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4096)> _
            Public err_msg2 As Char()
        End Structure
 
        '--------------↑声明SE_ERROR结构体↑-----------------


        '-------------------调用SE_connection_create函数----------------------
        '------------------连接SDE-------------------------
        '返回结果
        'SE_SUCCESS     0
        'SE_FAILURE     -1
        'SE_NO_ACCESS   -15
        'SE_SDE_NOT_STARTED     -5
        'SE_IOMGR_NOT_AVAILABLE     -101
        'SE_INVALID_DATABASE        -162
        'SE_INVALID_SERVER      -100
        'SE_INVALID_POINTER     -65
        'SE_INVALID_USER        -9
        'SE_LOGIN_NOT_ALLOWED       -8
        'SE_DBMS_DOES_NOT_SUPPORT       -1008
        'SE_NET_FAILURE     -10
        'SE_NET_TIMEOUT     -11
        'SE_SERVICE_NOT_FOUND       -102
        'SE_TASKS_EXCEEDED      -7
 
        <DllImport("sde.dll", SetLastError:=True,ThrowOnUnmappableChar:=True)> _
        Public Shared Function SE_connection_create(ByVal server As String, ByVal instance As String, _
        ByVal database As String, ByVal username As String, ByVal password As String, ByRef error1 As SE_ERROR, _
        ByRef connection As IntPtr) As Int32
        End Function


 '----------------------------调用SE_connection_free函数-------------------------
        '----------------------------释放SDE连接----------------------
        <DllImport("sde.dll", SetLastError:=True, ThrowOnUnmappableChar:=True)> _
        Public Shared Sub SE_connection_free(ByVal Byrefconnection As IntPtr)
        End Sub

 
 

在程序中的调用
Imports QHProject.SDE_C_API
Imports System.Runtime.InteropServices
 
Partial Class MapServicePage
    Inherits System.Web.UI.Page
 
    Private Shared conn As IntPtr = Nothing
    Private error1 As QHProject.SDE_C_API.SDE_C_API_Operation.SE_ERROR = Nothing
 
  
 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    End Sub
 
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        Dim i As Int32 = SDE_C_API_Operation.SE_connection_create("CL", "5151", "sde", "sde", "clbeyond", error1, conn)
        Button1.Text = i.ToString()
 
    End Sub
 
    Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        SDE_C_API_Operation.SE_connection_free(conn)
    End Sub
End Class


连接成功后Button的Text属性会显示为0,表示连接成功,在任务管理器中就会发现出现了一个gsrvr.ext进程。断开连接后gsrvr.exe进程就会消失。
当然前提是要在程序中将连接字段conn声明为shared类型(C#中的Static类型)。
需要注意的是Instance不是"esri_sde",而是端口号,一般为5151。
                                                                           2008年3月10日15:41:31


 

posted @ 2008-03-10 15:22  所言非虚  阅读(1005)  评论(1编辑  收藏  举报