OleDb CREATE TABLE 参数化

lilunlil 2018-12-17 04:24:46
首先,我想说,我在论坛中查找了许多贴子,终于弄明白了oledb与sqldb之间的区别,也自以为明白的差不多了,但下面这个问题实在头大,请高手指点。
正题,下面不带参数的过程是可以成功运行的

public int? UpdateCreate(string sql, OleDbParameter param)
{
sql = "CREATE TABLE 默认表名([列1] TEXT(50),[列2] TEXT(50),[列3] TEXT(50))";
ole_connection = new OleDbConnection(conn_str);
OleDbCommand cmd = new OleDbCommand(sql, ole_connection);
try
{
ole_connection.Open();
return cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
string errorInfo = "调用public static int Update()方法时出错";
Log.ErrLog(errorInfo + ex.Message, 1, true);
return null;
}
finally
{ ole_connection.Close(); }
}


下面是我研究后,想当然编出来的带参数的用法,肯定是错误的(因为编译通不过,提示语法错误),但问题是怎么样才是正确的。


public int? UpdateCreate(string sql, OleDbParameter param)
{
sql = "CREATE TABLE ?([列1] TEXT(50),[列2] TEXT(50),[列3] TEXT(50))";
ole_connection = new OleDbConnection(conn_str);
OleDbCommand cmd = new OleDbCommand(sql, ole_connection);
try
{
ole_connection.Open();
OleDbParameter parameter = new OleDbParameter("@表名", "预备表名");
cmd.Parameters.Add(parameter);
return cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
string errorInfo = "调用public static int Update()方法时出错";
Log.ErrLog(errorInfo + ex.Message, 1, true);
return null;
}
finally
{ ole_connection.Close(); }
}



...全文
295 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lilunlil 2018-12-20
  • 打赏
  • 举报
回复
引用 2 楼 6lilu9 的回复:
我来告诉你原因:参数化不是你想象中的替换,不是所有的地方都可以参数化的,表名,列名都不可以。 下面这个贴子就知道原因 https://blog.csdn.net/CRDBreeze/article/details/6437620
虽然没解决我的问题,貌似分也只能给你了。 不过还是谢谢你。
lilunlil 2018-12-18
  • 打赏
  • 举报
回复
这个版块不景气呀 我之所以问这个问题,是因为系统给我提示 严重性 代码 说明 项目 文件 行 禁止显示状态 警告 CA2100 传递给 'AccessHelper.UpdateCreate(string)' 中的 'OleDbCommand.OleDbCommand(string, OleDbConnection)' 的查询字符串可能包含以下变量 'sql'。如果其中的任意变量可能来自用户输入,请考虑使用存储过程或参数化 SQL 查询,而不是通过字符串串联来生成查询。
6lilu9 2018-12-18
  • 打赏
  • 举报
回复
我来告诉你原因:参数化不是你想象中的替换,不是所有的地方都可以参数化的,表名,列名都不可以。 下面这个贴子就知道原因 https://blog.csdn.net/CRDBreeze/article/details/6437620
存储过程的安全及性能优化 存储过程分类  系统存储过程  自定义存储过程  SQL Server使用者编写的存储过程  扩展存储过程  动态链接库(DLL)函数的调用看,主要用于客户端和服务器端之间进行通信  exec master..xp_cmdshell 'dir *.exe' -- 执行目录命令查询[sql2005\sql2008]  exec master..xp_fixeddrives --列出硬盘分区各自可用空间  xp_regwrite根键,子键,值名,值类型,值【sql2008拒绝访问】  写入注册表,例如:  exec master..db.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\run','TestValueName','reg_sz','hello'  xp_regdeletevalue 根键,子键,值名【sql2008拒绝访问】  删除注册表某个值  xp_regdeletekey键,值【sql2008拒绝访问】  删除该键下包括的所有值 xp_cmdshell语法  xp_cmdshell {'command_string'} [,no_output]  command_string是在操作系统命令行解释器上执行的命令字符串。command_string数据类型为varchar(255)或者nvarchar(4000),没有默认值  no_output为可选参数,可以控制是否想客户端返回信息  该存储过程一般情况下被禁用的,需要手动开启使用,如下:  exec sp_configure 'show advanced options',1  go   reconfigure  go   exec sp_configure 'xp_cmdshell',1—1表示启用,0表示禁用  go   reconfigure  go 删除xp_cmdshell SQL SERVER200删除xp_cmdshell use master exec sp_dropextendedproc 'xp_cmdshell' go SQL SERVER2005以上禁用xp_cmdshell,但不能删除掉 exec sp_configure 'xp_cmdshell',0 —1表示启用,0表示禁用  go reconfigure --让sp_configurre立即生效  go  exec sp_configure 'show advanced options',0  go   reconfigure  go --注意:SQL SERVER2008考虑安全性很多存储过程直接被拒绝访问 恢复/启用扩展存储过程 SQLServer2000 use master exec sp_addextendedproc xp_cmdshell,'xplog70.dll' go SQL Server2005或SQL Server2008启用xp_cmdshell  exec sp_configure 'show advanced options',1  go   reconfigure  go   exec sp_configure 'xp_cmdshell',1—1表示启用,0表示禁用  go   reconfigure  go 扩展存储过程的定义  扩展存储过程是SQL Server中的另一类存储过程,它是以其它语言编写的外部程序,是以动态链接库(DLL)形式存储在服务器上,最终SQLServer就可以动态加载并执行它们  编写好后使用SQLServer的固定角色sysadmin注册该扩展存储过程,并将执行权限授予其它用户,这个扩展存储过程只能添加到master数据库。  在编写扩展存储过程中可能要用到某些系统存储过程,这些系统存储过程如下: 利用OLE自动化存储过程调用dll 1.创建类库程序集 namespace PB_ExtendProcedure { public class ExtendProcedure { public string SayHi() { return "hello world"; } } } 2.生成动态链接库并注册到系统中 2.1.生成动态链接库使用VS2010命令行工具 使用sn命令生成一个强命名文件: sn -k he

7,713

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧