在查询了这么多资料之前我已经尝试过用手动的方式完成远程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.
Value | Meaning |
---|---|
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安装的机器, 复制一份过来尝试.
但愿能成功吧!