探讨解决bulk insert on remote server的问题

    在查询了这么多资料之前我已经尝试过用手动的方式完成远程bulk insert的功能, 就是通过共享. 而我所做的共享和其他人做的应该是不同的,我共享给某个计算机,而windows 有四个共享方式, 安全域, 计算机, 用户, 组.  默认情况下, 设置了共享以后, 进入对象类型里面看,就可以看到只勾了除计算机外的三个. 我把其他三个去掉,然后勾上计算机, 把SQLServer2005安装的机器名称填上去, 用客户端连上去, 成功通过UNC名称导入数据.

    由此可以知道,只共享给用户或者组域, SQLServer是没法取得访问的权限的, 只有把权限放给某个计算机才能使在主个计算机上的匿名用户(SQLServer)能够访问到远端的数据文件.

    然后我探讨使用VC++来实现这个设置共享的问题.

    这才是问题的关键!

    今天花了一天在VS2003上用NetShareAdd()方法添加共享,虽然能对everyone共享成功, 但是SQLServer还是没法访问到文件. 打开这个已经共享的文件的共享属性, 不出我所料, 所用的就是上面所说过的非计算机共享的三个对象类型. 这就是症结所在,我必需找到一个能把文件夹共享给计算机的方式.

     NetShareAdd的原型

NET_API_STATUS NetShareAdd(
  __in          LPWSTR servername,
  __in          DWORD level,
  __in          LPBYTE buf,   // 这就是共享的设置信息.根据level设置指向不同的结构体.
  __out         LPDWORD parm_err
);

    在VS2003中, LPBYPTE buf 这个结构体的level 有两种类型.

level  

Specifies the information level of the data. This parameter can be one of the following values.

ValueMeaning

2

Specifies information about the shared resource, including name of the resource, type and permissions, and number of connections. The buf parameter points to a SHARE_INFO_2 structure.

502

Specifies information about the shared resource, including name of the resource, type and permissions, number of connections, and other pertinent information. The buf parameter points to a SHARE_INFO_502 structure.

 

     对应的结构为:

typedef struct _SHARE_INFO_2 {
    LMSTR   shi2_netname;
    DWORD   shi2_type;
    LMSTR   shi2_remark;
    DWORD   shi2_permissions;
    DWORD   shi2_max_uses;
    DWORD   shi2_current_uses;
    LMSTR   shi2_path;
    LMSTR   shi2_passwd;
} SHARE_INFO_2, *PSHARE_INFO_2, *LPSHARE_INFO_2;

typedef struct _SHARE_INFO_501 {
    LMSTR   shi501_netname;
    DWORD   shi501_type;
    LMSTR   shi501_remark;
    DWORD   shi501_flags;
} SHARE_INFO_501, *PSHARE_INFO_501, *LPSHARE_INFO_501;

typedef struct _SHARE_INFO_502 {
    LMSTR     shi502_netname;
    DWORD     shi502_type;
    LMSTR     shi502_remark;
    DWORD     shi502_permissions;
    DWORD     shi502_max_uses;
    DWORD     shi502_current_uses;
    LMSTR     shi502_path;
    LMSTR     shi502_passwd;
    DWORD     shi502_reserved;
    PSECURITY_DESCRIPTOR  shi502_security_descriptor;
} SHARE_INFO_502, *PSHARE_INFO_502, *LPSHARE_INFO_502;

 

    然而我在家中的VS2008中, 虽然对应的MSDN上写的还和上面一样, 但打开这个值定义的文件, 发现下面的新类型!

typedef struct _SHARE_INFO_503 {
    LMSTR     shi503_netname;
    DWORD     shi503_type;
    LMSTR     shi503_remark;
    DWORD     shi503_permissions;
    DWORD     shi503_max_uses;
    DWORD     shi503_current_uses;
    LMSTR     shi503_path;
    LMSTR     shi503_passwd;
    LMSTR     shi503_servername;
    DWORD     shi503_reserved;
    PSECURITY_DESCRIPTOR  shi503_security_descriptor;
} SHARE_INFO_503, *PSHARE_INFO_503, *LPSHARE_INFO_503;

 

    看到servername了吧!

    再经过从官网上查证, 这是新加入的结构! 增加了指定服务器! 这不正是我要找的指定服务器共享的API吗!

    但现在在家没有装SQLServer, 家中的windows XP 也没有上述的四种对象类型的共享功能(版本不一样吧!)

    只有明天到公司把这个功能试一下! 但是有一个问题就是VS2003中使用的lmshare.h(NetShareAdd的声明文件)对应的库为netapi32.lib, VS2003中没有声明503这个结构, lib中也不会有对应的bin地址, 只有到公司试试找到VS2008安装的机器, 复制一份过来尝试.

    但愿能成功吧! 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值