使用 WCF 服务模型对 SQL 中具有大型数据类型的表和视图运行操作
SQL 适配器使适配器客户端能够读取和更新大型数据类型列中的数据,即 varchar (max) 、nvarchar (max) 或 varbinary (max) 。 若要从此类列读取数据,适配器客户端可以使用 Select 操作。 若要在此类列中插入或更新数据,适配器会公开 Set<column_name> 操作,其中 <column_name> 类型为 varchar (max) 、nvarchar (max) 或 varbinary (max) 的列的名称。
此外,在 SQL Server 中,可以将 varbinay (max) 列存储非结构化数据,例如文本文档和图像。 此类非结构化数据称为 FILESTREAM 数据。 FILESTREAM 数据可以作为文件存储在文件系统上。 SQL 适配器使客户端可以将 FILESTREAM 数据输入到 varbinary (max) 类型的列中。 FILESTREAM 存储 包含详细信息。
本主题提供有关在运行 SQL Server 的计算机和运行适配器客户端的计算机才能插入或更新 FILESTREAM 数据时必须执行的某些任务的信息。 本主题还提供了有关如何执行 Set<column_name> 操作以插入 FILESTREAM 数据的说明。
注意
如果要对具有用户定义类型列的表执行操作,请确保使用 SQL 适配器引用对表和视图的操作 User-Defined 类型。
必备条件
必须在运行 SQL Server 的计算机和运行适配器客户端的计算机上执行以下任务。
在运行 SQL Server 的计算机上
必须在 SQL Server 实例上启用 FILESTREAM。 请参阅 启用和配置 FILESTREAM。
必须创建启用了 FILESTREAM 的数据库。 请参阅 创建 FILESTREAM-Enabled 数据库。
必须具有用于存储 FILESTREAM 数据的表。 请参阅 创建用于存储 FILESTREAM 数据的表,
在运行适配器客户端的计算机上
- 必须安装 SQL 客户端连接 SDK。 可以通过运行SQL Server安装程序并在向导的“功能选择”页中选择“SQL 客户端连接 SDK”来安装 SQL 客户端连接 SDK。 适配器使用随 SQL 客户端连接 SDK 一起安装的 sqlncli10.dll 来执行 FILESTREAM 操作。
完成这些任务后,将全部设置为在SQL Server数据库表中插入或更新 FILESTREAM 数据。
本主题如何演示针对大型数据类型的操作
若要演示如何对具有大型数据类型的表执行“设置<column_name>”操作,请采用具有列 ID 和文档的表、记录:
记录表(包含所有数据)是通过运行随示例提供的 SQL 脚本创建的。 有关详细信息,请参阅 适配器示例。
Id 列的类型为 uniqueidentifier,采用 GUID。 假设 ID 列已具有 GUID“
438B7B4C-5491-409F-BCC1-78817C399EC3
”。Document 列的类型为 VARBINARY (MAX) 。 若要更新 “文档” 列,适配器会公开 SetDocument 操作。
注意
对于SQL Server,为了演示 FILESTREAM 操作,假设 Document 列可以存储 FILESTREAM 数据。
关于本主题中使用的示例
本主题中的示例对 Records 表执行操作。 记录表是通过运行示例提供的 SQL 脚本创建的。 有关示例的详细信息,请参阅 适配器示例。 SQL 适配器示例还提供了基于本主题 的示例 Records_FILESTREAM_Op。
WCF 客户端类
为 SQL 适配器发现的大型数据类型的操作生成的 WCF 客户端的名称基于表或视图的名称,如下表所示。
SQL Server数据库项目 | WCF 客户端名称 |
---|---|
表 | TableOp_[架构]_[TABLE_NAME]客户端 |
视图 | ViewOp_[架构]_[VIEW_NAME]客户端 |
[SCHEMA] = SQL Server项目的集合;例如,dbo。
用于对大型数据类型列调用操作的方法签名
下表显示了对表的基本操作的方法签名。 视图的签名相同,只是视图命名空间和名称替换了表的签名。
操作 | 方法签名 |
---|---|
设置<column_name> | public void set<column_name> (string Filter, byte[] Data) ; |
<> column_name= 大型数据类型的列的名称。
例如,以下代码显示了为默认“dbo”架构下的 Records 表上的 SetDocument 操作生成的 WCF 客户端类的方法签名。
public partial class TableOp_dbo_RecordsClient : System.ServiceModel.ClientBase<TableOp_dbo_Records>, TableOp_dbo_Records {
public void SetDocument (string Filter, byte[] Data);
}
在此代码片段中, TableOp_dbo_RecordsClient 是添加适配器服务引用插件生成的 SqlAdapterBindingClient.cs 中的 WCF 类的名称。
针对大型数据类型列的操作的参数
本部分提供 Set<column_name> 操作所需的参数。
参数名称 | 说明 |
---|---|
字符串筛选器 | 指定 WHERE 子句,适配器基于该子句更新大型数据类型列的记录。 |
byte[] 数据 | 指定必须为大型数据类型的列更新的值。 |
Set<column_name> 操作不返回任何值。
创建 WCF 客户端以调用大型数据类型列的操作
使用 WCF 客户端对 SQL Server 执行操作所需的一组泛型操作涉及使用 SQL 适配器的 WCF 服务模型概述中所述的一组任务。 本部分介绍如何创建 WCF 客户端来调用 Record 表上的 SetDocument 操作。 适配器公开 SetDocument 操作以更新大型数据类型列中的数据。
创建 WCF 客户端
在 Visual Studio 中创建 Visual C# 项目。 对于本主题,请创建控制台应用程序。
为 Record 表上的 SetDocument 操作生成 WCF 客户端类。 有关生成 WCF 客户端类的详细信息,请参阅为SQL Server项目生成 WCF 客户端或 WCF 服务协定。
在解决方案资源管理器中添加对
Microsoft.Adapters.Sql
、Microsoft.ServiceModel.Channels
和 的System.Transactions
引用。打开 Program.cs 文件并添加
System.Transactions
命名空间。在 Program.cs 中,按以下代码片段中所述创建客户端。
TableOp_dbo_RecordsClient client = new TableOp_dbo_RecordsClient("SqlAdapterBinding_TableOp_dbo_Records"); client.ClientCredentials.UserName.UserName = ""; client.ClientCredentials.UserName.Password = "";
在此代码片段中,
TableOp_dbo_RecordsClient
是在 SqlAdapterBindingClient.cs 中定义的 WCF 客户端。 此文件由添加适配器服务引用插件生成。SqlAdapterBinding_TableOp_dbo_Records
是客户端终结点配置的名称,在 app.config 中定义。此文件也由添加适配器服务引用插件生成,并包含绑定属性和其他配置设置。注意
若要对 FILESTREAM 数据执行操作,必须始终使用 Windows 身份验证 连接到 SQL Server。 若要使用 Windows 身份验证 进行连接,必须提供空用户名和密码,如前面的代码片段所示。 此外,在使用 Windows 身份验证 连接到 SQL Server 之前,必须已执行连接到 SQL Server将 Windows 身份验证与 SQL 适配器配合使用中所述的步骤。
注意
在此代码片段中,使用配置文件中的绑定和终结点地址。 还可以在代码中显式指定这些值。 有关指定客户端绑定的不同方法的详细信息,请参阅 为 SQL 适配器配置客户端绑定。
按以下代码片段中所述打开客户端:
try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }
对 Records 表调用 SetDocument 操作。
注意
设置<column_name> 操作必须始终在事务中执行。 若要确保这一点,必须在事务范围内调用 Set<column_name> 操作,并且必须在 app.config 中将 UseAmbientTransaction 绑定属性设置为 true 。
using (TransactionScope tx = new TransactionScope()) { string filter = "WHERE Id='438B7B4C-5491-409F-BCC1-78817C399EC3'"; byte[] data = ASCIIEncoding.ASCII.GetBytes("Sample data"); client.SetDocument(filter, data); tx.Complete(); }
在这里,应用程序将字符串“示例数据”转换为 base64 编码字符串,并在满足筛选条件的记录中更新它。
如以下代码片段中所述关闭客户端:
client.Close(); Console.WriteLine("Press any key to exit..."); Console.ReadLine();
生成项目,然后运行它。 应用程序更新记录表中的“文档”列。