我在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'之间没有隐式转换。和'字符串'
答案 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;