在查询了这么多资料之前我已经尝试过用手动的方式完成远程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 有两种类型.
levelSpecifies the information level of the data. This parameter can be one of the following values.
ValueMeaning2
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安装的机器, 复制一份过来尝试.
但愿能成功吧!