在WPF中调用更新过程?

时间:2015-06-20 19:09:51

标签: c# sql sql-server wpf

我在SQL Server中有一个Update存储过程,我从我的WPF应用程序调用它,但我只想更新我给的字段(我的过程更新了4列)。

当您在SQL中执行它并且在您不想更新的字段后面使用NULL时,它可以正常工作。那么是否可以给我的文本框一个NULL值,然后它会将它看作一个NULL值?

我的Update存储过程:

ALTER PROCEDURE [dbo].[InfoUpdate] 
    (@ID int, 
     @name varchar(20) = NULL, 
     @surname varchar(20) = NULL, 
     @city varchar(20) = NULL)
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON

    UPDATE dbo.Information
    SET Name = ISNULL(@name, Name),
        Surname= ISNULL(@surname, Surname),
        City= ISNULL(@city, City)
    WHERE ID = @ID 
END

当我执行时:

exec dbo.InfoUpdate
         @ID = 1,
         @name = XXX,
         @surname = NULL,
         @city = NULL

它有效,它保留旧数据并只更新我想要的列。

但是当你从WPF执行此操作时,它会使列空白打开。

我可以为文本框提供NULL值吗?

我的WPF代码:

 // Connection to database
 string cs = "Data Source=localhost;Initial Catalog=TESTSECTION;Integrated Security=True";

 SqlConnection conn = new SqlConnection();
 conn.ConnectionString = cs;

 string x = null;

 conn.Open();

 SqlCommand sqlcom = new SqlCommand("dbo.InfoUpdate", conn);
 sqlcom.Parameters.Add("@ID", SqlDbType.Int).Value = ID.Text;
 sqlcom.Parameters.Add("@name", SqlDbType.VarChar).Value = Name.Text;
 sqlcom.Parameters.Add("@surname", SqlDbType.VarChar).Value = Surname.Text;
 sqlcom.Parameters.Add("@city", SqlDbType.VarChar).Value = City.Text;
 sqlcom.CommandType = CommandType.StoredProcedure;

 sqlcom.ExecuteNonQuery();
 conn.Close();

 conn.Open();
 DataTable dt = new DataTable();

 SqlDataAdapter da = new SqlDataAdapter();
 da.SelectCommand = new SqlCommand("SELECT * FROM dbo.Information", conn);
 da.Fill(dt);

 DataGrid.ItemsSource = dt.DefaultView;
 conn.Close();

我的错误从这里开始:

DBNull.Value : Name.Text;

无法确定条件表达式的类型,因为System.DBNull'之间没有隐式转换。和'字符串'

1 个答案:

答案 0 :(得分:1)

正如我在上面的评论中所说,你不能将TextBox.Text设置为NULL。如果你试图这样做没有任何反应,当你读回它时,你再次得到一个空字符串。

但是,当文本框为空(或空格)时,您可以将参数设置为DBNull.Value

sqlcom.Parameters.Add("@name", SqlDbType.VarChar).Value =
       string.IsNullOrWhiteSpace(Name.Text) ? DBNull.Value : (object)Name.Text;
sqlcom.Parameters.Add("@surname", SqlDbType.VarChar).Value = 
       string.IsNullOrWhiteSpace(Surname.Text) ? DBNull.Value : (object)Surname.Text;
sqlcom.Parameters.Add("@city", SqlDbType.VarChar).Value = 
       string.IsNullOrWhiteSpace(City.Text) ? DBNull.Value : (object)City.Text;