Skip to content
久久日记本
曾经年少爱追梦,一心只想往前飞
  • 首页
  • 博客
    • 博客历史
    • 主题
    • 个人文集
  • 关于
    • 正在读的书
    • 作品归档
    • 2018作品归档
    • 联系我
  • 友情链接
  • 留言板
❄
❅
❆
❄
❅
❆
❄
❅
❆
❄
DB

MSSQL和Oracle中使用参数的区别

Posted on 2013年9月25日 by 九九 / 2114 Views

本文目录

目录

*1.发现的问题

*2.定义一个Users表[用户表]

*3.创建Users类

*4.MSSQL和Oracle中的参数传值

*5.总结

1.发现的问题

在C#里面,以前写数据库查询方面的东西基本上就是拼接字符串(判断一下没有关键字就行了),现在在C#连接Oracle中拼接使用参数,但是发现总会提示错误:

错误1:插入数字无效;

错误2:”mydb”失败,没有可用的错误消息,结果代码:DB_E_BADORDINAL(0X80040E55)

总算知道错误原因了。Sql中参数用@,而Oracle语句中参数用?,而且,插入数据库的字符真的需要不少区别。

做一个例子:

例子:

2.定义一个Users表[用户表]

MSSQL中:

Create table Users
(
    id int,
    name varchar,
    pwd varchar,
    dates datetime
)

Oracle中:

Create table Users
(
    id number,
    name varchar2(10),
    pwd varchar2(10),
    dates date
)
3.创建Users类
public class Users
    {
         public int id { get; set; }
         public string username { get; set; }
         public string pwd { get; set; }
         public DateTime dates { get; set; }
    }
4.MSSQL和Oracle中的参数传值

增加一个方法,改方法指定增加 Users 数据,

MSSQL:

public bool AddOneUser(Users user)
         {
             StringBuilder strSql = new StringBuilder();
             strSql.Append("insert into test1(id,username,pwd,dates) ");
             strSql.Append("values(@id,@username,@pwd,@dates)");
             //注意里面的@,PS:千万不能加上单引号!什么都别加,切记!!!
             SqlParameter[] para = new SqlParameter[]{
                 new SqlParameter("@id",SqlDbType.Int),
                 new SqlParameter("@username",SqlDbType.VarChar),
                 new SqlParameter("@pwd",SqlDbType.VarChar),
                 new SqlParameter("@dates",SqlDbType.DateTime)
             };
             para[0].Value = user.id;
             para[1].Value = user.username;
             para[2].Value = user.pwd;
             para[3].Value = user.dates;
             int ret = SqlHelper.ExecuteNonQuery(CommandType.Text, strSql.ToString(), para);//别忘了para得带入诶

             if (ret > 0)
             {
                 return true;
             }
             else
                return false;
         }

Oracle:

public bool AddOneUser(Users user)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("insert into test1(id,username,pwd,dates) ");
            strSql.Append("values(to_number(?),?,?,to_date(?,'yyyy-mm-dd hh24:mi:ss'))");
            //注意?
            OleDbParameter[] para = new OleDbParameter[]{
                new OleDbParameter("@id",OleDbType.VarChar),
                new OleDbParameter("@username",OleDbType.VarChar),
                new OleDbParameter("@pwd",OleDbType.VarChar),
                new OleDbParameter("@dates",OleDbType.VarChar)
            };
            para[0].Value = user.id;
            para[1].Value = user.username;
            para[2].Value = user.pwd;
            para[3].Value = user.dates;
            int ret = OracleHelper.ExecuteNonQuery(CommandType.Text, strSql.ToString(), para);

            if (ret > 0)
            {
                return true;
            }
            else
                return false;
        }

PS:

SqlParameter:表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射。

OleDbParameter:表示 OleDbCommand 的参数,还可以表示它到 DataSet 列的映射

5.总结

①在MSSQL中,

1.定义的参数使用 @;

2.传参类型可以直接在 new SqlParameter(“@id”,SqlDbType.Int) 写出来就可以;

3.传参的不要 在 @id 之类的上面单引号,不管 @id 是什么数据类型;(PS:20131112更新,血的教训!!!)

②在Oracle中,

1.定义的参数使用 ?,可以用 ? 完全代替,诶,以前不知道。

2.传参类型可以在 new SqlParameter(“@id”,SqlDbType.Varchar) 写出来,发现这里直接写实在不好转换,把转换丢在PL/SQL语句里面方便点: to_number(?)

③安全性

以前喜欢拼接字符串,然后用一段代码过滤:

/// <summary>
        /// 检查传入字符串是否包含sql语句
        /// </summary>
        /// <param name="str">传入字符串</param>
        /// <returns>包含返回true,不包含返回false</returns>
        public bool FilterSql(string str)
        {
            string word = "and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join|cmd";
            if (str == null)
            {
                return false;
            }
            foreach (string i in word.Split('|'))
            {
                if (str.ToLower().IndexOf(i + " ") > -1 || (str.ToLower().IndexOf(" " + i) > -1))
                {
                    return true;
                }
            }
            return false;
        }

才发现多么愚蠢:(传送门) 感谢 @冰麟轻武

select * from Users where id like '%'and(1=1)and'%'='%'

居然查出来全表,这样的语句自己居然以前没有看到。

MSSQL, Oracle
九九
过去的我们,现在的自己,往事,终会随风而逝。 View all posts by 九九 →

Post navigation

Older post
MonoAndroid打包成apk实机无法运行
Newer post
时间

标签云

2019ncov Android ASP.NET Baby C# C/C++ CSS Div DX11 flask front-end GAE Git Java JJProject JS Life MSSQL MVC OpenSource Oracle Python React React-Native Software Tools Vue Webpack Website Window WP7 乱记 十年旧梦 天气 宝宝成长日记 小说 工作 情感 故障 散文 日记 网新实训笔记 花落梧桐 诗间集 转载

时光机

  • 2023年3月
  • 2023年2月
  • 2022年12月
  • 2022年4月
  • 2022年3月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年5月
  • 2019年12月
  • 2019年10月
  • 2019年9月
  • 2019年6月
  • 2019年5月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年3月
  • 2018年2月
  • 2018年1月
  • 2017年11月
  • 2017年10月
  • 2017年9月
  • 2017年7月
  • 2017年3月
  • 2017年1月
  • 2016年12月
  • 2016年11月
  • 2016年10月
  • 2016年7月
  • 2016年3月
  • 2016年2月
  • 2016年1月
  • 2015年12月
  • 2015年11月
  • 2015年10月
  • 2015年9月
  • 2015年8月
  • 2015年7月
  • 2015年4月
  • 2015年3月
  • 2015年2月
  • 2015年1月
  • 2014年12月
  • 2014年11月
  • 2014年10月
  • 2014年9月
  • 2014年8月
  • 2014年7月
  • 2014年6月
  • 2014年5月
  • 2014年4月
  • 2014年3月
  • 2014年2月
  • 2014年1月
  • 2013年12月
  • 2013年11月
  • 2013年10月
  • 2013年9月
  • 2013年8月
  • 2013年7月
  • 2013年6月
  • 2013年5月
  • 2013年4月
  • 2013年3月
  • 2013年1月
  • 2012年11月
  • 2012年10月
  • 2012年9月
  • 2012年8月
  • 2012年7月
  • 2012年6月
  • 2012年5月
  • 2012年4月
  • 2012年3月
  • 2012年2月
  • 2012年1月
  • 2011年12月
  • 2011年11月
  • 2011年10月
  • 2011年9月
  • 2011年8月
  • 2011年6月
  • 2011年5月
  • 2011年4月
  • 2011年3月
  • 2011年2月
  • 2010年12月
  • 2010年11月
  • 2010年10月
  • 2010年9月
  • 2010年8月
  • 2010年6月
  • 2010年5月
  • 2010年2月
  • 2010年1月
  • 2009年12月
  • 2009年11月
  • 2009年10月
  • 2009年9月
  • 2009年8月
  • 2009年7月
  • 2009年6月
  • 2009年5月
  • 2009年4月
  • 2009年3月
  • 2009年2月
  • 2009年1月
  • 2008年8月
  • 2008年6月
  • 2008年5月
  • 2008年4月
  • 2008年2月
  • 2007年11月
  • 2007年8月
  • 2007年6月
  • 2007年5月
  • 2007年4月
  • 2007年3月
  • 2007年2月
  • 2007年1月
  • 2006年10月
  • 2006年8月
© 2006 - 2023 久久日记本
Powered by WordPress | Theme: Graphy for 99diary