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 操作,假设 文档 列能够存储 FILESTREAM 数据。
关于本主题中使用的示例
本主题中的示例对 Records 表执行操作。 记录表是通过运行随示例提供的 SQL 脚本创建的。 有关示例的详细信息,请参阅 适配器示例。 SQL 适配器示例中还提供了一个名为 Records_FILESTREAM_Op 的示例,该示例基于本主题。
WCF 客户端类
为 SQL 适配器发现的大型数据类型操作生成的 WCF 客户端名称基于表或视图的名称,如下表所列。
SQL Server 数据库工件 | WCF 客户端名称 |
---|---|
表 | TableOp_[Schema]_[TABLE_NAME]Client |
查看 | ViewOp_[Schema]_[VIEW_NAME]Client |
[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> 作所需的参数。
参数名称 | DESCRIPTION |
---|---|
字符串筛选器 | 指定 WHERE 子句,适配器根据该子句更新大型数据类型列的记录。 |
byte[] Data | 指定必须为大型数据类型的列更新的值。 |
Set<column_name> 作不返回任何值。
创建 WCF 客户端以调用大型数据类型列的作业
使用 WCF 客户端在 SQL Server 上执行作所需的泛型作集涉及使用 SQL 适配器的 WCF 服务模型概述中所述的一组任务。 本部分介绍如何创建 WCF 客户端,以调用 记录 表上的 SetDocument 操作。 适配器公开 SetDocument 操作用于更新大数据类型列中的数据。
创建 WCF 客户端
在 Visual Studio 中创建 Visual C# 项目。 对于本主题,请创建控制台应用程序。
为Records表的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 适配器中使用 Windows 身份验证连接到 SQL Server 中提到的步骤。
注释
在此代码片段中,将使用配置文件中的绑定和终结点地址。 还可以在代码中显式指定这些值。 有关指定客户端绑定的不同方式的详细信息,请参阅 为 SQL 适配器配置客户端绑定。
按以下代码片段中所述打开客户端:
try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }
对 Records 表调用 SetDocument 操作。
谨慎
必须始终在事务中执行<设定column_name>操作。 若要确保这一点,必须在事务范围内调用 Set<column_name> 作,并且 UseAmbientTransaction 绑定属性必须在 app.config中设置为 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();
生成项目,然后运行它。 应用程序更新“记录”表中的“文档”列。