insert into access数据库,int类型的字段插入空值怎么写?

例句:
int age;
sql = "insert into data(username,sex,age)"
+ "values('" + dr["username"].ToString().Replace("'", "''") + "','" + dr["sex"].ToString().Replace("'", "'") + "'," +age + ")";
如果age类型是int,需要写入一个空值,怎么办?总是报错。

之前回复过题主了。需要判断下数据是否为数字之类的,不是默认一个0或者null(注意是字符串,不能赋值为C#的null),因为组合成sql后会出错,sql没有值

有帮助麻烦点个采纳【本回答右上角】,谢谢~~有其他问题可以继续交流~

 
            int age;
            if (!int.TryParse(dr["age"].ToString(), out age)) age = 0;//这样,一定要为null,可以赋值为 age="null";这样拼接sql的时候就会变为 insert into data(username,sex,age)values('username','sex',null)"
            sql = "insert into data(username,sex,age)"
            + "values('" + dr["username"].ToString().Replace("'", "''") + "','" + dr["sex"].ToString().Replace("'", "'") + "'," +age + ")";
 


组合SQL语句执行一定要防止sql注入,常用的方法
1)内容替换
字符串类将单引号号替换为实体对象'【&注意是英文状态下,csdn编辑器有问题,直接打英文状态下的实体对象显示不出来】或者直接去掉
数字型,一定要先判断内容,如果是不是数字默认一个值0或者"null"(为null注意数据库字段设置一定要允许为空,要不执行sql会出错)
2)SQL语句参数化,简单示例如下,不过参数化也解决不了类型问题,还是需要自己判断类型后不符合设置为默认值

img

using System;
using System.Data.OleDb;
using System.Data;
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string sql = "insert into data(username,sex,age)values(?,?,?)";
            OleDbConnection conn = new OleDbConnection(@"provider=microsoft.ace.oledb.12.0;data source=D:\文件\C#\Console\ConsoleApp1\bin\Debug\data.accdb");
            conn.Open();
            OleDbCommand cmd = new OleDbCommand(sql, conn);
            //注意access参数化传入的参数是按照参数出现顺序来添加,顺序能乱,名称随便起,一样也无所谓
            cmd.Parameters.Add(new OleDbParameter() { ParameterName = "?", OleDbType = OleDbType.VarWChar, Size = 20, Value = "username的值" });
            cmd.Parameters.Add(new OleDbParameter() { ParameterName = "p", OleDbType = OleDbType.VarWChar, Size = 20, Value = "sex的值" });
            cmd.Parameters.Add(new OleDbParameter() { ParameterName = "p", OleDbType = OleDbType.Integer, Value = 123 });
            cmd.ExecuteNonQuery();
            conn.Close();
            Console.ReadKey();
        }
    }
}


下面这个为我常用的类型判断类库,题主可以用类库判断类型不正确默认一个值

using System;
using System.Text.RegularExpressions;
/// <summary>
/// 数据有效性检查
/// </summary>
public class DataCheck
{
    /// <summary>
    /// 判断内容是否为空
    /// </summary>
    /// <param name="v"></param>
    /// <returns></returns>
    public static bool IsNull(string v) { return string.IsNullOrEmpty(v) || v.Trim() == ""; }
    /// <summary>
    /// 判断是否为数字(浮点数之类)
    /// </summary>
    /// <param name="v"></param>
    /// <returns></returns>
    public static bool IsNumeric(string v)
    {
        return !IsNull(v) && Regex.IsMatch(v, @"^-?\d+(\.\d+)?$", RegexOptions.Compiled);
    }
    /// <summary>
    /// 判断是否为数字(整形)
    /// </summary>
    /// <param name="v"></param>
    /// <returns></returns>
    public static bool IsInt(string v)
    {
        return !IsNull(v) && Regex.IsMatch(v, @"^-?\d+$", RegexOptions.Compiled);
    }
    /// <summary>
    /// 判断是否为日期
    /// </summary>
    /// <param name="v"></param>
    /// <returns></returns>
    public static bool IsDate(string v)
    {
        DateTime dt = new DateTime();
        return !IsNull(v) && DateTime.TryParse(v, out dt);
    }
}

不要拼接SQL,即使你能够保证足够安全,不会出现SQL注入,也尽量的不要拼接SQL。
用参数化查询吧,这里我找了个例子,你参考一下。


你SQL语句里面int空值可以写null,比如:
insert into data(username,sex,age) values("zs","",null)
你可以把你的异常贴出来,好确定到底什么问题

int age;
sql = "insert into data(username,sex,age)"

  • "values('" + dr["username"].ToString().Replace("'", "''") + "','" + dr["sex"].ToString().Replace("'", "'") + "'," +age + ")";
    如果age类型是int,需要写入一个空值,怎么办?修改为:
int age;
sql = "insert into data(username,sex,age)"
+ "values('" + dr["username"].ToString().Replace("'", "''") + "','" + dr["sex"].ToString().Replace("'", "'") + "',null)";

没有报错日志来判断,如何知道是什么问题;


解决方法千千万万,单靠一句话就来判断,太突兀了。

可以用0等特殊意义的数字代替!

用insert into XXX values(),不要写字段,要插入null值的字段就填null,不要空着

拼sql的话,因为要拼成字符串,如果age是None,是会报错的。可以有两种解决方案:
1、age为None的时候就设置为0或者-1
2、sql可以采用占位符的方式,eg:
insert into data (username,sex,age) values(@username, @sex, @age)这种方式

1.首先数据库age字段可以为空
2.insert的时候不加age字段就行了

你可以数据库age字段默认为null,然后sql语句插入时,不插入这个字段