专案需要,需要在数据库中提供一个些数据,可让用户读取,但不能修改。
或许你需要创建一个表,手动添加这些静态数据,这样的话,用户有可能直接打开数据库修改。
也许你会创建一个table-valued 函数并加密。
解决方案很多,下面Insus.NET使用Clr存储过程来实现,把数据直接设置于CLR程序中。当部署于SQL时,如果用户没有拿到dll,也许一时无法修改,仅能只读了。
创建一个CLR存储过程:
可复制代码:
[Microsoft.SqlServer.Server.SqlProcedure] public static void SiteInfor() { //创建变量 SqlMetaData Id; SqlMetaData Name; SqlMetaData Key; SqlDataRecord record; //创建metadata列(字段)。 Id = new SqlMetaData("Id", SqlDbType.Int); Name = new SqlMetaData("Name", SqlDbType.NVarChar,25); Key = new SqlMetaData("Key", SqlDbType.NVarChar,30); //使用metadata列创建一笔新记录 record = new SqlDataRecord(new SqlMetaData[] { Id, Name, Key }); //为列域赋值。 record.SetInt32(0,1); record.SetString(1, "DG"); record.SetString(2, "5a01ceba-4168-44a2-a68a-5b430e5ad127"); //将记录发送到调用程序。 SqlContext.Pipe.Send(record); }
部署至SQL中,有两种方式,一是手动在Microsoft SQL Management Studio下进行,还有一个是在查询分析器执行SQL语句。两种方法,均在前面的CLR相关文章中详细提及。
部署成功,我们可以在SQL数据库可看到CLR存储过程:
此存储过程,我们是无法Modify的。
试执行此存储过程:
下面内容于2015-04-03 09:40分修改或补充:
针对最后一段代码,修改如下:
SqlContext.Pipe.SendResultsStart(record);
SqlContext.Pipe.SendResultsRow(record);
SqlContext.Pipe.SendResultsEnd();