请问怎么在数据库中插入一条记录就执行C#中的一段代码? 你可以在插入操作后判断,如果成功则执行你要执行的代码,这是个常用的操作,比如如果执行插入要刷新datagrid。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在表上使用insert触发器,当触发器被触发时调用C#编写的扩展存储过程,不知道我的理解对不对,还是你是需要C#的界面作配合?如果是需要与界面做配合的话,这个插入的操作需要使用存储过程来完成,并带有输出参数,程序可以根据这个参数确定插入是否成功。如果当别的控制器也控制这个数据表,当数据源发生插入操作时也需要更新本地的话(执行本地C#代码),就会稍微有一些麻烦了,是否可以实先编写一个扩展存储过程,在里面定义socket,当insert触发器被触发时调用这个扩展存储过程,同时扩展过程里面的socket发送数据到本地的客户socket,本地根据接收到的实时信息作不同的操作。如果有更简单的方法请告知 最好的办法是用触发器,前提是执行的那条C#语句也是针对数据库的或者就是下面的SqlCommand objComm = new SqlCommand();int nCount = dd.ExecuteNonQuery();if(nCount > 0 ){ 。里想要执行的程序}ExecuteNonQuery()能返回影响表的行数,比如增加,删除等 记着,查询不影响行数 如果数据库以及C#程序都在本地,并且实时性不是很强的话,就不用这样麻烦,可以新建一个表保存插入的详细记录,然后C#启用一个线程专门遍历这个表,当发生变化时作不同的操作我说的是Windows FORM程序,如果是web应用程序的话,就需要使用web service来实现 扩展存储过程得使用很简单,sql server的联机帮助上有很详细的说明以及demo 楼上的能否给个扩展存储过程的例子还有如果用web service的话具体怎么实现呢》? 下面是我测试的一个socket的例子,使用C语言写的,#include <stdafx.h>#include <stdlib.h>#include <time.h>#define XP_NOERROR 0#define XP_ERROR 1#define MAXCOLNAME 25#define MAXNAME 25#define MAXTEXT 255#ifdef __cplusplusextern "C" {#endif#ifdef _WIN32#include <winsock.h>#else#include <errno.h>#endif#if defined(_MSC_VER)# pragma comment(lib,"wsock32.lib")#elif defined(__BORLANDC__)# pragma comment(lib,"mswsock.lib")#endif#pragma pack(1)enum{ LOCAL_USER =0, OUTSIDE_USER =1, FOREIGN_USER =2, /////////////// NET_ABIS_PACKET =3, NET_HLR_PACKET =4, NET_A_PACKET =5, NET_SMS_SUBMIT_PACKET =7,//add 2002-9-29 NET_SMS_DELIEVER_PACKET =8,//add 2002-9-29 SS7_STAT_PACKET =9, NET_QUERY_VLR_PACKET = 10,};//Define User Type & Packet Typetypedef struct{ unsigned int msisdn;//手机号 格式类似3900000000 unsigned int cgi;//扇区现在lac unsigned char updatetype;//手机更新类型 int time;//时间 unsigned char sch;//业务类型}VLR_DATA;//HLR的数据更新typedef struct{__int64 imsi;__int64 msisdn;//8613XXXXXXXXXunsigned char sch;//UserType;unsigned int msc;// int sch;}NET_HLR_DATA;//查询内存VLR数据typedef struct{ __int64 imsi; __int64 msisdn;}NET_QUERY_VLR;//查询内存VLR数据结果typedef struct{ __int64 imsi;//卡号 VLR_DATA vlrdata;//直取VLR数据}NET_QUERY_VLR_RESP;//查询返回数据如果返回的数据全为0 则表标 查询失败//网络上所有数据包typedef struct{ unsigned short PacketLen; unsigned short PacketType; union { NET_QUERY_VLR queryvlr; NET_HLR_DATA hlrdata; NET_QUERY_VLR_RESP queryvlrresp; };}NET_DATA;#pragma pack()SOCKET sd_client = 0;BOOL g_bInitSocket = false;char szFileName[MAX_PATH+1];//互斥CRITICAL_SECTION g_csec;BOOL g_bcs = false;int InitMySocket();void CloseMySocket();RETCODE __declspec(dllexport) xp_GetCurLocation(SRV_PROC *srvproc);RETCODE __declspec(dllexport) xp_RegistUser(SRV_PROC *srvproc);#ifdef __cplusplus}#endifvoid InitCS(){ if (!g_bcs) InitializeCriticalSection( &g_csec); g_bcs = true;}void DeleteCS(){ if (g_bcs) DeleteCriticalSection( &g_csec); g_bcs = false;}int InitMySocket(){ int iErr; u_short iPort; struct sockaddr_in addr_srv; char pszFileName[MAX_PATH]; //= "c:\\winnt\\StorProc.ini"; GetWindowsDirectory(pszFileName,MAX_PATH); strcat(pszFileName,"\\StorProc.ini"); char pszHost[20]; GetPrivateProfileString("net","ip","192.168.0.201",pszHost,16,pszFileName); iPort = GetPrivateProfileInt( "net", "port", 8080, pszFileName ); WSADATA wsaData; WORD wVersionRequested; wVersionRequested = MAKEWORD( 1,1 ); iErr = WSAStartup( wVersionRequested, &wsaData ); if ( iErr != 0 ) { //WriteInfo("Error: Winsock not available\n" + iErr); return 1; }else g_bInitSocket = true; sd_client = socket(PF_INET, SOCK_STREAM, 0); if (sd_client == INVALID_SOCKET) { //WriteInfo("没有更多的socket资源"); return 1; } addr_srv.sin_family = PF_INET; addr_srv.sin_addr.S_un.S_addr = inet_addr(pszHost); addr_srv.sin_port = htons(iPort); TIMEVAL timeout; FD_SET fdset; timeout.tv_sec = 2; timeout.tv_usec= 0; FD_ZERO( &fdset); FD_SET ( sd_client, &fdset); iErr = select( 0, NULL, &fdset, NULL, &timeout); iErr = connect(sd_client, (struct sockaddr *) &addr_srv, sizeof(addr_srv)); if (iErr == INVALID_SOCKET) { //WriteInfo("连接服务器失败!"); return 1; } else { //WriteInfo("成功连接服务器!\n"); return 0; }}void CloseMySocket(){ closesocket(sd_client); if (g_bInitSocket) WSACleanup(); sd_client=0;} RETCODE __declspec(dllexport) xp_RegistUser(SRV_PROC* pSrvProc){ RETCODE nRet = XP_NOERROR; int iErrCode = 0; bool bEnterCS = false; int nSizeQ; unsigned char szFlag; char szMsisdn[14]; BYTE bType; unsigned long cbMaxLen; unsigned long cbActualLen; BOOL fNull; NET_DATA nData; memset(&nData,0,sizeof(nData)); memset(szMsisdn,0,14); int paramCount = srv_rpcparams(pSrvProc); if (paramCount != 4) { return XP_ERROR; } if (sd_client == 0) { if (InitMySocket() ) {// 101:网络错误 iErrCode = 101; sd_client = 0; goto ERR_TAB; } } nSizeQ = sizeof(NET_HLR_DATA)+4; int ret = srv_paraminfo(pSrvProc, 1, &bType, &cbMaxLen, &cbActualLen, NULL, &fNull); if (cbActualLen){ int err; ///////////////////////////////// nData.PacketLen = nSizeQ; nData.PacketType = NET_HLR_PACKET; memcpy(szMsisdn, srv_paramdata(pSrvProc, 1), cbActualLen); ret = srv_paraminfo(pSrvProc, 2, &bType, &cbMaxLen, &cbActualLen, NULL, &fNull); memcpy(&nData.hlrdata.imsi,srv_paramdata(pSrvProc, 2),cbActualLen); ret = srv_paraminfo(pSrvProc, 3, &bType, &cbMaxLen, &cbActualLen, NULL, &fNull); memcpy(&szFlag, srv_paramdata(pSrvProc, 3), cbActualLen); //nData.hlrdata.imsi = 0; nData.hlrdata.msc = 0; //if (szFlag == 1) nData.hlrdata.sch = 0x11; //if (szFlag == 0) nData.hlrdata.sch = 0x10; nData.hlrdata.sch = szFlag; nData.hlrdata.msisdn = _atoi64(szMsisdn); ///////////////////////////////// InitCS();//初始化临界区 EnterCriticalSection( &g_csec);//开始进行临界区 bEnterCS = true; err = send (sd_client, (char *)&nData, nSizeQ, 0); if (err!=nSizeQ) { CloseMySocket(); iErrCode = 102; goto ERR_TAB; } } else { return XP_ERROR; } ERR_TAB: if (bEnterCS) LeaveCriticalSection( &g_csec);//离开临界区,注意在return之前一定要调用 否则下一次永远不会进入临界区 srv_paramsetoutput(pSrvProc,4,(BYTE *)&iErrCode,4,FALSE); return XP_NOERROR;}RETCODE __declspec(dllexport) xp_GetCurLocation(SRV_PROC* pSrvProc){ RETCODE nRet = XP_NOERROR; int iErrCode = 0; bool bEnterCS = false; TIMEVAL timeout; FD_SET fdset; timeout.tv_sec = 2; timeout.tv_usec= 0; int nSizeQ,nSizeR; char szMsisdn[14]; BYTE bType; unsigned long cbMaxLen; unsigned long cbActualLen; BOOL fNull; char szImsi[20]; char sTime[20]; int iLac,iCi; iLac = 0; iCi = 0; NET_DATA nData; NET_DATA rData; memset(&rData,0,sizeof(rData)); memset(szMsisdn,0,14); memset(sTime,0,20); int paramCount = srv_rpcparams(pSrvProc); if (paramCount != 8) { return XP_ERROR; } if (sd_client == 0) { if (InitMySocket() ) {// 101:网络错误 iErrCode = 101; sd_client = 0; goto ERR_TAB; } } nSizeQ = sizeof(NET_QUERY_VLR)+4; nSizeR = sizeof(NET_QUERY_VLR_RESP)+4; int ret = srv_paraminfo(pSrvProc, 1, &bType, &cbMaxLen, &cbActualLen, NULL, &fNull); if (cbActualLen){ int err; ///////////////////////////////// nData.PacketLen = nSizeQ; nData.PacketType = NET_QUERY_VLR_PACKET; memcpy(szMsisdn, srv_paramdata(pSrvProc, 1), cbActualLen); nData.queryvlr.msisdn = _atoi64(szMsisdn); nData.queryvlr.imsi = 0; ///////////////////////////////// InitCS();//初始化临界区 EnterCriticalSection( &g_csec);//开始进行临界区 bEnterCS = true; err = send (sd_client, (char *)&nData, nSizeQ, 0); if (err!=nSizeQ) { CloseMySocket(); iErrCode = 102; goto ERR_TAB; } FD_ZERO( &fdset); FD_SET ( sd_client, &fdset); err = select( 0, &fdset, NULL, NULL, &timeout); if( err != 1) nRet = XP_ERROR; err = recv( sd_client, (char*)&rData, nSizeR, 0); if(err < nSizeR) { CloseMySocket(); iErrCode = 103; goto ERR_TAB; } // 测试值 //rData.queryvlrresp.imsi = 460001234567890; //rData.queryvlrresp.vlrdata.cgi = 1; //rData.queryvlrresp.vlrdata.time = time(NULL); //rData.queryvlrresp.vlrdata.updatetype=49; ////////////////////////////////// _i64toa(rData.queryvlrresp.imsi,szImsi,10); struct tm *now; now = localtime( (long *)&rData.queryvlrresp.vlrdata.time); sprintf(sTime ,"%04d-%02d-%02d %02d:%02d:%02d", now->tm_year+1900, now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); //转换成lac与ci iLac = rData.queryvlrresp.vlrdata.cgi>>16; iCi = rData.queryvlrresp.vlrdata.cgi & 0xffff; } else { return XP_ERROR; }ERR_TAB: if (bEnterCS) LeaveCriticalSection( &g_csec);//离开临界区,注意在return之前一定要调用 否则下一次永远不会进入临界区 srv_paramsetoutput(pSrvProc,2,(BYTE *)szImsi,15,FALSE); srv_paramsetoutput(pSrvProc,3,(BYTE *)&(iLac),4,FALSE); srv_paramsetoutput(pSrvProc,4,(BYTE *)&(iCi),4,FALSE); srv_paramsetoutput(pSrvProc,5,(BYTE *)&(rData.queryvlrresp.vlrdata.updatetype),1,FALSE); srv_paramsetoutput(pSrvProc,6,(BYTE *)&sTime,19,FALSE); srv_paramsetoutput(pSrvProc,7,(BYTE *)&iErrCode,4,FALSE); srv_paramsetoutput(pSrvProc,8,(BYTE *)&(rData.queryvlrresp.vlrdata.sch),1,FALSE); return XP_NOERROR;} 关于webservice的实现方式就是怎样动态的显示到客户端的问题,你可以反编译一个带有进度条的上传控件看看,呵呵,手头没有现成的例子 我在网上找到了用C#编写的扩展存储过程,但看不太懂,能否帮忙解释一下,谢了//C# file: Csserver.cs using System; using System.Runtime.InteropServices; using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyTitle("CSServer")] [assembly: AssemblyDescription("Test SQL .NET interop")] [assembly: AssemblyVersion("1.0.0.1")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("MyKey.snk")] namespace SQLInterop { public interface ITest{ string SayHello(); } [ClassInterface(ClassInterfaceType.AutoDual)] public class CsharpHelper : ITest { public string SayHello() { return "Hello from CSharp"; } } } 然后创建用 sn -k 为该类库创建一个强名密钥文件,并编译之。sn -k MyKey.snk csc /t:library Csserver.cs 注册该类库:regasm /tlb:Csserver.tlb csserver.dll /codebase 这样一个扩展存储过程就编写注册完了,下面我们在sql server中测试一下效果。T-SQL stored proc. DECLARE @object int DECLARE @hr int DECLARE @property varchar(255) DECLARE @return varchar(255) DECLARE @src varchar(255), @desc varchar(255) -- 创建对象实例。 EXEC @hr = sp_OACreate 'SQLInterop.CsharpHelper', @object OUT IF @hr <> 0 BEGIN EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc RETURN END -- 调用对象方法。 EXEC @hr = sp_OAMethod @object, 'SayHello', @return OUT IF @hr <> 0 BEGIN EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc RETURN END PRINT @return -- 销毁对象实例。 EXEC @hr = sp_OADestroy @object IF @hr <> 0 BEGIN EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc RETURN END to herony420(尽头)如果我需要C#的界面作配合那该怎么做呢 合作开发仿真软件(车间生产流程) 關於System.IO.Ports串口的問題 关于C#开发音频播放器显示时间的方法 C# DataGridView 数据库 我的子窗体显示菜单问题 关于带有sql数据库的程序的发布问题 当前日期和数据库里生日(datetime)的比较问题~ 请问sql代码怎么写? 求翻译,关于C翻译成C#代码 求助:Winform窗体间传值 实践。拜谢老师大侠!!! 多线程同步问题,明白的进来指点一下阿(没分了,送个祝福)..... 网页中登录程序用什么作为认证,cookie,还是其它的什么?请给指点一下,谢谢 如何返回系统路径或者程序的当前路径
或者就是下面的
SqlCommand objComm = new SqlCommand();
int nCount = dd.ExecuteNonQuery();
if(nCount > 0 )
{
。里想要执行的程序
}ExecuteNonQuery()能返回影响表的行数,比如增加,删除等
记着,查询不影响行数
还有如果用web service的话具体怎么实现呢》?
#include <stdafx.h>
#include <stdlib.h>
#include <time.h>#define XP_NOERROR 0
#define XP_ERROR 1
#define MAXCOLNAME 25
#define MAXNAME 25
#define MAXTEXT 255#ifdef __cplusplus
extern "C" {
#endif#ifdef _WIN32
#include <winsock.h>
#else
#include <errno.h>
#endif#if defined(_MSC_VER)
# pragma comment(lib,"wsock32.lib")
#elif defined(__BORLANDC__)
# pragma comment(lib,"mswsock.lib")
#endif#pragma pack(1)
enum
{
LOCAL_USER =0,
OUTSIDE_USER =1,
FOREIGN_USER =2,
///////////////
NET_ABIS_PACKET =3,
NET_HLR_PACKET =4,
NET_A_PACKET =5,
NET_SMS_SUBMIT_PACKET =7,//add 2002-9-29
NET_SMS_DELIEVER_PACKET =8,//add 2002-9-29
SS7_STAT_PACKET =9,
NET_QUERY_VLR_PACKET = 10,
};//Define User Type & Packet Type
typedef struct
{
unsigned int msisdn;//手机号 格式类似3900000000
unsigned int cgi;//扇区现在lac
unsigned char updatetype;//手机更新类型
int time;//时间
unsigned char sch;//业务类型
}VLR_DATA;//HLR的数据更新
typedef struct
{
__int64 imsi;
__int64 msisdn;//8613XXXXXXXXX
unsigned char sch;//UserType;
unsigned int msc;
// int sch;
}NET_HLR_DATA;//查询内存VLR数据
typedef struct
{
__int64 imsi;
__int64 msisdn;
}NET_QUERY_VLR;
//查询内存VLR数据结果typedef struct
{
__int64 imsi;//卡号
VLR_DATA vlrdata;//直取VLR数据
}NET_QUERY_VLR_RESP;//查询返回数据如果返回的数据全为0 则表标 查询失败
//网络上所有数据包
typedef struct
{
unsigned short PacketLen;
unsigned short PacketType;
union
{
NET_QUERY_VLR queryvlr;
NET_HLR_DATA hlrdata;
NET_QUERY_VLR_RESP queryvlrresp;
};
}NET_DATA;
#pragma pack()SOCKET sd_client = 0;
BOOL g_bInitSocket = false;
char szFileName[MAX_PATH+1];
//互斥
CRITICAL_SECTION g_csec;
BOOL g_bcs = false;
int InitMySocket();
void CloseMySocket();RETCODE __declspec(dllexport) xp_GetCurLocation(SRV_PROC *srvproc);
RETCODE __declspec(dllexport) xp_RegistUser(SRV_PROC *srvproc);#ifdef __cplusplus
}
#endifvoid InitCS()
{
if (!g_bcs)
InitializeCriticalSection( &g_csec);
g_bcs = true;
}
void DeleteCS()
{
if (g_bcs)
DeleteCriticalSection( &g_csec);
g_bcs = false;
}
int InitMySocket()
{
int iErr; u_short iPort;
struct sockaddr_in addr_srv;
char pszFileName[MAX_PATH]; //= "c:\\winnt\\StorProc.ini";
GetWindowsDirectory(pszFileName,MAX_PATH);
strcat(pszFileName,"\\StorProc.ini");
char pszHost[20];
GetPrivateProfileString("net","ip","192.168.0.201",pszHost,16,pszFileName);
iPort = GetPrivateProfileInt(
"net",
"port",
8080,
pszFileName
); WSADATA wsaData;
WORD wVersionRequested; wVersionRequested = MAKEWORD( 1,1 );
iErr = WSAStartup( wVersionRequested, &wsaData );
if ( iErr != 0 ) {
//WriteInfo("Error: Winsock not available\n" + iErr);
return 1;
}else g_bInitSocket = true; sd_client = socket(PF_INET, SOCK_STREAM, 0);
if (sd_client == INVALID_SOCKET)
{
//WriteInfo("没有更多的socket资源");
return 1;
}
addr_srv.sin_family = PF_INET;
addr_srv.sin_addr.S_un.S_addr = inet_addr(pszHost);
addr_srv.sin_port = htons(iPort); TIMEVAL timeout;
FD_SET fdset;
timeout.tv_sec = 2;
timeout.tv_usec= 0;
FD_ZERO( &fdset);
FD_SET ( sd_client, &fdset);
iErr = select(
0,
NULL,
&fdset,
NULL,
&timeout); iErr = connect(sd_client, (struct sockaddr *) &addr_srv,
sizeof(addr_srv));
if (iErr == INVALID_SOCKET)
{
//WriteInfo("连接服务器失败!");
return 1;
}
else
{
//WriteInfo("成功连接服务器!\n");
return 0;
}
}void CloseMySocket()
{
closesocket(sd_client);
if (g_bInitSocket)
WSACleanup();
sd_client=0;
}
{
RETCODE nRet = XP_NOERROR;
int iErrCode = 0;
bool bEnterCS = false;
int nSizeQ;
unsigned char szFlag;
char szMsisdn[14];
BYTE bType;
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL fNull; NET_DATA nData; memset(&nData,0,sizeof(nData));
memset(szMsisdn,0,14); int paramCount = srv_rpcparams(pSrvProc);
if (paramCount != 4)
{
return XP_ERROR;
}
if (sd_client == 0)
{
if (InitMySocket() )
{// 101:网络错误
iErrCode = 101;
sd_client = 0;
goto ERR_TAB;
}
}
nSizeQ = sizeof(NET_HLR_DATA)+4;
int ret = srv_paraminfo(pSrvProc, 1, &bType, &cbMaxLen, &cbActualLen,
NULL, &fNull); if (cbActualLen){
int err; /////////////////////////////////
nData.PacketLen = nSizeQ;
nData.PacketType = NET_HLR_PACKET;
memcpy(szMsisdn, srv_paramdata(pSrvProc, 1), cbActualLen);
ret = srv_paraminfo(pSrvProc, 2, &bType, &cbMaxLen, &cbActualLen,
NULL, &fNull);
memcpy(&nData.hlrdata.imsi,srv_paramdata(pSrvProc, 2),cbActualLen);
ret = srv_paraminfo(pSrvProc, 3, &bType, &cbMaxLen, &cbActualLen,
NULL, &fNull);
memcpy(&szFlag, srv_paramdata(pSrvProc, 3), cbActualLen);
//nData.hlrdata.imsi = 0;
nData.hlrdata.msc = 0;
//if (szFlag == 1) nData.hlrdata.sch = 0x11;
//if (szFlag == 0) nData.hlrdata.sch = 0x10;
nData.hlrdata.sch = szFlag;
nData.hlrdata.msisdn = _atoi64(szMsisdn); /////////////////////////////////
InitCS();//初始化临界区
EnterCriticalSection( &g_csec);//开始进行临界区
bEnterCS = true;
err = send (sd_client, (char *)&nData, nSizeQ, 0);
if (err!=nSizeQ)
{
CloseMySocket();
iErrCode = 102;
goto ERR_TAB;
}
}
else {
return XP_ERROR;
} ERR_TAB:
if (bEnterCS) LeaveCriticalSection( &g_csec);//离开临界区,注意在return之前一定要调用 否则下一次永远不会进入临界区
srv_paramsetoutput(pSrvProc,4,(BYTE *)&iErrCode,4,FALSE);
return XP_NOERROR;
}RETCODE __declspec(dllexport) xp_GetCurLocation(SRV_PROC* pSrvProc)
{
RETCODE nRet = XP_NOERROR;
int iErrCode = 0;
bool bEnterCS = false; TIMEVAL timeout;
FD_SET fdset;
timeout.tv_sec = 2;
timeout.tv_usec= 0;
int nSizeQ,nSizeR;
char szMsisdn[14];
BYTE bType;
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL fNull; char szImsi[20];
char sTime[20]; int iLac,iCi;
iLac = 0;
iCi = 0; NET_DATA nData;
NET_DATA rData; memset(&rData,0,sizeof(rData));
memset(szMsisdn,0,14);
memset(sTime,0,20);
int paramCount = srv_rpcparams(pSrvProc);
if (paramCount != 8)
{
return XP_ERROR;
}
if (sd_client == 0)
{
if (InitMySocket() )
{// 101:网络错误
iErrCode = 101;
sd_client = 0;
goto ERR_TAB;
}
} nSizeQ = sizeof(NET_QUERY_VLR)+4;
nSizeR = sizeof(NET_QUERY_VLR_RESP)+4; int ret = srv_paraminfo(pSrvProc, 1, &bType, &cbMaxLen, &cbActualLen,
NULL, &fNull);
if (cbActualLen){
int err; /////////////////////////////////
nData.PacketLen = nSizeQ;
nData.PacketType = NET_QUERY_VLR_PACKET;
memcpy(szMsisdn, srv_paramdata(pSrvProc, 1), cbActualLen);
nData.queryvlr.msisdn = _atoi64(szMsisdn);
nData.queryvlr.imsi = 0;
/////////////////////////////////
InitCS();//初始化临界区
EnterCriticalSection( &g_csec);//开始进行临界区
bEnterCS = true;
err = send (sd_client, (char *)&nData, nSizeQ, 0);
if (err!=nSizeQ)
{
CloseMySocket();
iErrCode = 102;
goto ERR_TAB;
} FD_ZERO( &fdset);
FD_SET ( sd_client, &fdset); err = select(
0,
&fdset,
NULL,
NULL,
&timeout);
if( err != 1)
nRet = XP_ERROR;
err = recv( sd_client, (char*)&rData, nSizeR, 0);
if(err < nSizeR)
{
CloseMySocket();
iErrCode = 103;
goto ERR_TAB;
}
// 测试值
//rData.queryvlrresp.imsi = 460001234567890;
//rData.queryvlrresp.vlrdata.cgi = 1;
//rData.queryvlrresp.vlrdata.time = time(NULL);
//rData.queryvlrresp.vlrdata.updatetype=49;
//////////////////////////////////
_i64toa(rData.queryvlrresp.imsi,szImsi,10);
struct tm *now;
now = localtime( (long *)&rData.queryvlrresp.vlrdata.time);
sprintf(sTime ,"%04d-%02d-%02d %02d:%02d:%02d",
now->tm_year+1900,
now->tm_mon + 1,
now->tm_mday,
now->tm_hour,
now->tm_min,
now->tm_sec);
//转换成lac与ci
iLac = rData.queryvlrresp.vlrdata.cgi>>16;
iCi = rData.queryvlrresp.vlrdata.cgi & 0xffff;
}
else {
return XP_ERROR;
}ERR_TAB:
if (bEnterCS) LeaveCriticalSection( &g_csec);//离开临界区,注意在return之前一定要调用 否则下一次永远不会进入临界区
srv_paramsetoutput(pSrvProc,2,(BYTE *)szImsi,15,FALSE);
srv_paramsetoutput(pSrvProc,3,(BYTE *)&(iLac),4,FALSE);
srv_paramsetoutput(pSrvProc,4,(BYTE *)&(iCi),4,FALSE);
srv_paramsetoutput(pSrvProc,5,(BYTE *)&(rData.queryvlrresp.vlrdata.updatetype),1,FALSE);
srv_paramsetoutput(pSrvProc,6,(BYTE *)&sTime,19,FALSE);
srv_paramsetoutput(pSrvProc,7,(BYTE *)&iErrCode,4,FALSE);
srv_paramsetoutput(pSrvProc,8,(BYTE *)&(rData.queryvlrresp.vlrdata.sch),1,FALSE);
return XP_NOERROR;}
//C# file: Csserver.cs using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Runtime.CompilerServices; [assembly: AssemblyTitle("CSServer")]
[assembly: AssemblyDescription("Test SQL .NET interop")]
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("MyKey.snk")]
namespace SQLInterop {
public interface ITest{
string SayHello();
} [ClassInterface(ClassInterfaceType.AutoDual)]
public class CsharpHelper : ITest {
public string SayHello() {
return "Hello from CSharp";
}
}
}
然后创建用 sn -k 为该类库创建一个强名密钥文件,并编译之。
sn -k MyKey.snk
csc /t:library Csserver.cs 注册该类库:
regasm /tlb:Csserver.tlb csserver.dll /codebase
这样一个扩展存储过程就编写注册完了,下面我们在sql server中测试一下效果。T-SQL stored proc. DECLARE @object int
DECLARE @hr int
DECLARE @property varchar(255)
DECLARE @return varchar(255)
DECLARE @src varchar(255), @desc varchar(255) -- 创建对象实例。
EXEC @hr = sp_OACreate 'SQLInterop.CsharpHelper', @object OUT
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END -- 调用对象方法。
EXEC @hr = sp_OAMethod @object, 'SayHello', @return OUT
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END
PRINT @return -- 销毁对象实例。
EXEC @hr = sp_OADestroy @object
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END
如果我需要C#的界面作配合那该怎么做呢