相关疑难解决方法(0)

AddWithValue参数为NULL时的异常

我有以下代码来指定SQL查询的参数.我使用时会遇到异常Code 1; 但是当我使用时工作正常Code 2.在Code 2我们检查null并因此检查if..else块.

例外:

参数化查询'(@ application_ex_id nvarchar(4000))SELECT E.application_ex_id A'需要参数'@application_ex_id',这是未提供的.

代码1:

command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
Run Code Online (Sandbox Code Playgroud)

代码2:

if (logSearch.LogID != null)
{
         command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
}
else
{
        command.Parameters.AddWithValue("@application_ex_id", DBNull.Value );
}
Run Code Online (Sandbox Code Playgroud)

  1. 你能解释一下为什么它无法从代码1中的logSearch.LogID值中获取NULL(但能够接受DBNull)吗?

  2. 有没有更好的代码来处理这个?

参考:

  1. 将null分配给SqlParameter
  2. 返回的数据类型因表中的数据而异
  3. 从数据库smallint到C#nullable int的转换错误
  4. DBNull有什么意义?

    public Collection<Log> GetLogs(LogSearch logSearch)
    {
        Collection<Log> logs = new Collection<Log>();

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            string commandText = @"SELECT  *
                FROM Application_Ex E 
                WHERE  (E.application_ex_id = @application_ex_id …
Run Code Online (Sandbox Code Playgroud)

.net c# ado.net

76
推荐指数
2
解决办法
5万
查看次数

如何强制实体框架插入标识列?

我想编写一些C#代码来使用一些种子数据初始化我的数据库.显然,这需要能够在插入时设置各种Identity列的值.我正在使用代码优先的方法.默认情况下,DbContext处理数据库连接,因此您不能SET IDENTITY_INSERT [dbo].[MyTable] ON.所以,到目前为止我所做的是使用DbContext构造函数,它允许我指定要使用的数据库连接.然后,我设置IDENTITY_INSERTON该数据库的连接,然后尝试使用实体框架插入我的记录.这是我到目前为止所得到的一个例子:

public class MyUserSeeder : IEntitySeeder {
    public void InitializeEntities(AssessmentSystemContext context, SqlConnection connection) {
        context.MyUsers.Add(new MyUser { MyUserId = 106, ConceptPersonId = 520476, Salutation = "Mrs", Firstname = "Novelette", Surname = "Aldred", Email = null, LoginId = "520476", Password="28c923d21b68fdf129b46de949b9f7e0d03f6ced8e9404066f4f3a75e115147489c9f68195c2128e320ca9018cd711df", IsEnabled = true, SpecialRequirements = null });
        try {
            connection.Open();
            SqlCommand cmd = new SqlCommand("SET IDENTITY_INSERT [dbo].[MyUser] ON", connection);
            int retVal = cmd.ExecuteNonQuery();
            context.SaveChanges();
        }
        finally {
            connection.Close(); …
Run Code Online (Sandbox Code Playgroud)

database sql-server asp.net entity-framework ef-code-first

54
推荐指数
5
解决办法
7万
查看次数

为什么这个代码在C#中无效?

以下代码将无法编译:

string foo = "bar";
Object o = foo == null ? DBNull.Value : foo;
Run Code Online (Sandbox Code Playgroud)

我得到:错误1无法确定条件表达式的类型,因为'System.DBNull'和'string'之间没有隐式转换

要解决这个问题,我必须做这样的事情:

string foo = "bar";
Object o = foo == null ? DBNull.Value : (Object)foo;
Run Code Online (Sandbox Code Playgroud)

这个演员似乎毫无意义,因为这肯定是合法的:

string foo = "bar";
Object o = foo == null ? "gork" : foo;
Run Code Online (Sandbox Code Playgroud)

在我看来,当三元分支具有不同类型时,编译器不会将值自动提供给类型对象...但是当它们属于相同类型时,则自动装箱是自动的.

在我看来,第一个声明应该是合法的......

任何人都可以描述为什么编译器不允许这样做以及为什么C#的设计者选择这样做?我相信这在Java中是合法的......虽然我没有验证这一点.

谢谢.

编辑:我要求理解为什么Java和C#以不同的方式处理这个问题,C#中的场景下发生了什么使得它无效.我知道如何使用三元,而不是寻找一个"更好的方法"来编写示例代码.我理解C#中的三元规则,但我想知道为什么......

编辑(Jon Skeet):删除了"autoboxing"标签,因为这个问题没有涉及拳击.

c# dbnull nullable conditional-operator

40
推荐指数
3
解决办法
1万
查看次数

使用EntityFramework使用null参数值调用存储过程

我在sqlserver 2008上有一个存储过程,其中一个参数接受空值.我不知道如何在参数上调用带有空值的SP.为了更多的上下文我正在使用EntityFramework 6xx

在下一个例子中,参数"@status,@ Compatible"可以将null作为值,但我只是得到一个例外,说没有提供那些prarams.

public override IList<MyOutputType> SearchStuff(string Term, int? status, bool? Compatible, long TMPLDMID, int RangeFrom, int RangeTo)
{
    List<SqlParameter> par = new List<SqlParameter>();
    par.Add(new SqlParameter("@Term", System.Data.SqlDbType.VarChar, 50) { Value = "%" + Term + "%" });
    par.Add(new SqlParameter("@status", System.Data.SqlDbType.Int) { Value = status, IsNullable = true });
    par.Add(new SqlParameter("@Compatible", Compatible) { IsNullable = true });
    par.Add(new SqlParameter("@TMPLDMID", TMPLDMID));
    par.Add(new SqlParameter("@RangeFrom", RangeFrom));
    par.Add(new SqlParameter("@RangeTo", RangeTo));

    return db.Database.SqlQuery<MyOutputType>(
        "EXEC [spSearchForStuff] @Term, @status, @Compatible, @TMPLDMID, @RangeFrom, @RangeTo", par.ToArray()
    ).ToList();
Run Code Online (Sandbox Code Playgroud)

parameters null stored-procedures entity-framework

13
推荐指数
1
解决办法
9918
查看次数

如何将空值传递给SqlCommand的参数

在有人评论之前已经在其他问题上回答过这个问题之前,我知道这一点......但是尽管我已经回顾了这些答案

甚至我自己的问题

我无法让我的查询返回带有null参数的值

我已经尝试简化我的代码,因此可以在这里看到.

我也试过这个

 int? i = null;

 SqlConnection connection = new SqlConnection(Properties.Settings.Default.connstring.ToString());

 SqlCommand cmd = new SqlCommand();
 cmd.Connection = connection;
 cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk";
 cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull);

 cmd.Connection.Open();

 var dataReader = cmd.ExecuteReader();
 var dataTable = new DataTable();
 dataTable.Load(dataReader);

 cmd.Connection.Close();
Run Code Online (Sandbox Code Playgroud)

我尝试过这方面的变化

cmd.Parameters.AddWithValue("@parent_pk", DBNull.Value);
Run Code Online (Sandbox Code Playgroud)

我尝试过使用该查询

cmd.CommandText = "Select * from view_nests where parent_pk = @parent_pk or @parent_pk Is Null";
Run Code Online (Sandbox Code Playgroud)

我尝试将参数明确声明为可为空

cmd.Parameters.AddWithValue("@parent_pk", i ?? Convert.DBNull).IsNullable = true; …
Run Code Online (Sandbox Code Playgroud)

c# sql-server dbnull sqlparameter

2
推荐指数
2
解决办法
8987
查看次数