【问题标题】:if String is empty then data is not inserting如果 String 为空,则不插入数据
【发布时间】:2019-07-30 08:26:08
【问题描述】:
String query = "insert into Odisha_Customer_data([Share _Id], FirstName, MiddleName, LastName, FatherHusbandName, MotherName, "
    + "id,  DOB, Age, CustNatureDesc, [Date of Membership], "
    + "Religion, Nationality, UID, PAN, Segment, IntroducerAccNo, EmpCode, IDproof, IDProofNo, ResidentialProofDesc, ResidentialProofNo, "
    + "AnnualIncomeDetails, [Risk Category of customer], [Closing Bal], Title, gender, category, occupation, community, Qualification, MaritalStatusDesc)"+
    " SELeCT @ShareId, @FirstName, @MiddleName, @LastName, @FatherHusbandName, @MotherName, @id,"
    + "@DOB, @Age, @CustNatureDesc, @DateofMembership, @Religion, @Nationality, @UID, @PAN,"
    + " @Segment, @IntroducerAccNo, @EmpCode, @IDproof, @IDProofNo, @ResidentialProofDesc, @ResidentialProofNo, @AnnualIncomeDetails, @RiskCategoryofcustomer, @ClosingBal," +
    "t.TitleID AS title, g.GenderId AS gender, cat.CatagoryID AS category, o.OccupationID AS Occupation, c.CommunityID AS Community, q.QualificationID AS Qualification," +
    " m.MaritalStatusID AS MaritalStatus FROM Title AS t INNER JOIN Gender AS g ON t.Title = @title INNER JOIN Catagory AS cat ON cat.catagoryname = @Category " +
    "INNER JOIN Occupation AS o ON o.OccupationName = @Occupation INNER JOIN Community AS c ON c.CommunityName = @Community " +
    " INNER JOIN Qualification AS q ON q.QualificationName = @qualification INNER JOIN MaritalStatus AS m ON m.MaritalStatusDesc = @maritalStatusDesc " +
    "WHERE @title Is Not Null AND g.gendername = @Gender AND @Category Is Not Null AND @Occupation Is Not Null " +
    "AND @Community Is Not Null AND @qualification Is Not Null AND @maritalStatusDesc Is Not Null";

//query = "UPDATE a SET a.MaritalStatusDesc = b.MaritalStatusID From Odisha_Customer_data AS a INNER JOIN MaritalStatus AS b ON b.MaritalStatusDesc = '" + MaritalStatusDesc + "' where a.rowid = (Select max(rowid) as NewCustomer from Odisha_Customer_data)";

SqlCommand cmd = new SqlCommand(query, con);

cmd.Parameters.Add(new SqlParameter("@title", string.IsNullOrEmpty(Title) ? (object)DBNull.Value : Title));
cmd.Parameters.Add(new SqlParameter("@Gender", string.IsNullOrEmpty(gender) ? (object)DBNull.Value : gender));
cmd.Parameters.Add(new SqlParameter("@Occupation", string.IsNullOrEmpty(occupation) ? (object)DBNull.Value : occupation));
cmd.Parameters.Add(new SqlParameter("@Category", string.IsNullOrEmpty(category) ? (object)DBNull.Value : category));
cmd.Parameters.Add(new SqlParameter("@Community", string.IsNullOrEmpty(community) ? (object)DBNull.Value : community));
cmd.Parameters.Add(new SqlParameter("@qualification", string.IsNullOrEmpty(Qualification) ? (object)DBNull.Value : Qualification));
cmd.Parameters.Add(new SqlParameter("@maritalStatusDesc", string.IsNullOrEmpty(MaritalStatusDesc) ? (object)DBNull.Value : MaritalStatusDesc));

cmd.Parameters.Add(new SqlParameter("@ShareId", string.IsNullOrEmpty(ShareId) ? (object)DBNull.Value : ShareId));
cmd.Parameters.Add(new SqlParameter("@FirstName", string.IsNullOrEmpty(FirstName) ? (object)DBNull.Value : FirstName));
cmd.Parameters.Add(new SqlParameter("@MiddleName", string.IsNullOrEmpty(MiddleName) ? (object)DBNull.Value : MiddleName));
cmd.Parameters.Add(new SqlParameter("@LastName", string.IsNullOrEmpty(LastName) ? (object)DBNull.Value : LastName));
cmd.Parameters.Add(new SqlParameter("@FatherHusbandName", string.IsNullOrEmpty(FatherHusbandName) ? (object)DBNull.Value : FatherHusbandName));
cmd.Parameters.Add(new SqlParameter("@MotherName", string.IsNullOrEmpty(MotherName) ? (object)DBNull.Value : MotherName));
cmd.Parameters.Add(new SqlParameter("@id", string.IsNullOrEmpty(id) ? (object)DBNull.Value : id));
cmd.Parameters.Add(new SqlParameter("@DOB", string.IsNullOrEmpty(DOB) ? (object)DBNull.Value : DOB));
cmd.Parameters.Add(new SqlParameter("@Age", string.IsNullOrEmpty(Age) ? (object)DBNull.Value : Age));
cmd.Parameters.Add(new SqlParameter("@CustNatureDesc", string.IsNullOrEmpty(CustNatureDesc) ? (object)DBNull.Value : CustNatureDesc));
cmd.Parameters.Add(new SqlParameter("@DateofMembership", string.IsNullOrEmpty(DateofMembership) ? (object)DBNull.Value : DateofMembership));
cmd.Parameters.Add(new SqlParameter("@Religion", string.IsNullOrEmpty(Religion) ? (object)DBNull.Value : Religion));
cmd.Parameters.Add(new SqlParameter("@Nationality", string.IsNullOrEmpty(Nationality) ? (object)DBNull.Value : Nationality));
cmd.Parameters.Add(new SqlParameter("@UID", string.IsNullOrEmpty(UID) ? (object)DBNull.Value : UID));
cmd.Parameters.Add(new SqlParameter("@PAN", string.IsNullOrEmpty(PAN) ? (object)DBNull.Value : PAN));
cmd.Parameters.Add(new SqlParameter("@Segment", string.IsNullOrEmpty(Segment) ? (object)DBNull.Value : Segment));
cmd.Parameters.Add(new SqlParameter("@IntroducerAccNo", string.IsNullOrEmpty(IntroducerAccNo) ? (object)DBNull.Value : IntroducerAccNo));
cmd.Parameters.Add(new SqlParameter("@EmpCode", string.IsNullOrEmpty(EmpCode) ? (object)DBNull.Value : EmpCode));
cmd.Parameters.Add(new SqlParameter("@IDproof", string.IsNullOrEmpty(IDproof) ? (object)DBNull.Value : IDproof));
cmd.Parameters.Add(new SqlParameter("@IDProofNo", string.IsNullOrEmpty(IDProofNo) ? (object)DBNull.Value : IDProofNo));
cmd.Parameters.Add(new SqlParameter("@ResidentialProofDesc", string.IsNullOrEmpty(ResidentialProofDesc) ? (object)DBNull.Value : ResidentialProofDesc));
cmd.Parameters.Add(new SqlParameter("@ResidentialProofNo", string.IsNullOrEmpty(ResidentialProofNo) ? (object)DBNull.Value : ResidentialProofNo));
cmd.Parameters.Add(new SqlParameter("@AnnualIncomeDetails", string.IsNullOrEmpty(AnnualIncomeDetails) ? (object)DBNull.Value : AnnualIncomeDetails));
cmd.Parameters.Add(new SqlParameter("@RiskCategoryofcustomer", string.IsNullOrEmpty(RiskCategoryofcustomer) ? (object)DBNull.Value : RiskCategoryofcustomer));
cmd.Parameters.Add(new SqlParameter("@ClosingBal", string.IsNullOrEmpty(ClosingBal) ? (object)DBNull.Value : ClosingBal));

cmd.ExecuteNonQuery();
con.Close();

我的完整代码是这样的,我只想要标题、性别等字符串值为空的地方,然后将 Null 保存在 DB 表中。但是使用此代码,只要标题、性别等字符串值为空,则不会插入数据。如果所有字符串都有值,那么数据将完美保存。请查看代码并纠正我。

【问题讨论】:

  • inner joins 就是这样工作的——了解其他连接类型
  • 你也应该好好利用whiteslace。这段代码真的很难读。

标签: c# sql .net sql-server


【解决方案1】:

您在这里遇到了多个问题。一个,正如 cmets 中所指出的那样,INNER JOIN 不能连接到 NULL(实际上没有连接可以,但请继续阅读..)所以,例如,您在 SQL 中编写:

INNER JOIN MaritalStatus AS m ON m.MaritalStatusDesc = @maritalStatusDesc

然后你写你的代码:

cmd.Parameters.Add(new SqlParameter("@maritalStatusDesc", string.IsNullOrEmpty(MaritalStatusDesc) ? (object)DBNull.Value : MaritalStatusDesc));

如果 marital status 为空,您的 c# 将向 DB 发送 NULL(简化),对于 DB,因为有一个硬性规定,“没有什么永远等于 NULL”,这意味着 JOIN 失败.当内连接失败时,它会从结果集中删除整行,因此没有可以再插入的行

第二个问题是你主动要求如果某些提供的参数为空,则不返回任何数据:

WHERE ... AND @maritalStatusDesc Is Not Null

如果您将 maritalsStatusDesc 参数设置为 null 就是这样 - 游戏结束了,希望从这个查询中得到任何东西;它永远不会返回一行,因为您的 where 子句坚持查询仅在参数不为空时返回行..


那该怎么办呢?

使用像实体框架或 nHibernate 这样的 ORM;它使这些东西变得轻而易举。您使用对象,分配婚姻状况并且它起作用。如果没有分配,EF 会为你计算出所有的 null 东西

如果您坚持以目前的方式进行,请删除该 WHERE 子句并将所有 INNER 连接转换为 LEFT OUTER。现在,当您执行此操作并发送空数据时,连接将失败,因此您不会从 maritalstatus 表中获取任何数据(该行的 ID 列将为空,因此希望您的主列可以为空)但是它至少意味着结果集仍然会有一行可以插入

就个人而言,我不会试图在一份声明中做到这一切。如果您想知道“已婚”状态的 ID,请先在代码中查找,这样您就有了 ID,然后可以插入它。使用两条 SQL 语句;一个是SELECT ID FROM MaritalStatus WHERE MaritalStatusDesc = @msd,另一个是INSERT INTO ... VALUES @msd_id,@msg_id 是您在运行插入语句之前查找的 ID

您可以通过一个辅助类来简化您的生活,该类接受字符串描述并返回 ID(或返回 DBNull.Value),以便在您准备运行插入时作为参数添加的一部分完成查找:

cmd.Parameters.Add(new SqlParameter("@maritalStatusId", IDLookupHelper.GetIDForMaritalStatusDesc(msdTextBox.Text)));

这可能是这样的代码:

public object GetIDForMaritalStatusDesc(string msd){
  if(string.IsNullOrEmpty(msd))
    return DBNull.Value;
  using(SqlCommand sq = new SqlCommand(
    "connstr here", 
    "SELECT ID FROM MaritalStatusWHERE Desc = @msd"
  );){
    sq.Parameters.AddWithValue("@msd", msd); //note: google "can we stop using addwithvalue already"

    try{ 
      return sq.ExecuteScalar();
    } catch {
      return DBNull.Value
    }
  }
}

这是一个存根;你可以扩展它。这只是给你一个想法。请考虑为此使用 ORM,因为您可以避免浪费生命编写无聊的重复数据访问代码 - ORM 将做得更好、更快,并使您的工作生活更有趣

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2013-08-06
    相关资源
    最近更新 更多