怎么给让视图的求和字段具有默认值

如何给让视图的求和字段具有默认值
本帖最后由 blackeagleX 于 2015-04-20 16:38:08 编辑
首先视图是这样的。

SELECT Product.编号, Product.型号, Product.建议售价, Product.适用机型, Product.质量, Product.出厂价, Product.分类, Product.备注, Sum(Storage.数量) AS 库存总数
FROM Storage LEFT JOIN Product ON Storage.[产品编号]=Product.编号
GROUP BY Product.编号, Product.型号, Product.适用机型, Product.出厂价, Product.分类, Product.建议售价, Product.备注, Product.质量, Storage.[产品编号];

我在C# 代码中将该视图的每一列和文本框绑定,来实现对product表和storage表的增删改。

            StandardCommands commands = new StandardCommands();
            CommandDict.Add("productstorage", commands);

            OleDbCommand productInsertCommand = new OleDbCommand();
            productInsertCommand.CommandText = "INSERT INTO product (型号, 适用机型, 出厂价,质量, 分类, 建议售价, 备注) VALUES (?, ?,?, ?, ?, ?, ?)";
            productInsertCommand.CommandType = CommandType.Text;
            DataBaseManager.AddInputParamToCommand(productInsertCommand, "型号", OleDbType.VarWChar);
            DataBaseManager.AddInputParamToCommand(productInsertCommand, "适用机型", OleDbType.VarWChar);
            DataBaseManager.AddInputParamToCommand(productInsertCommand, "出厂价", OleDbType.Single);
            DataBaseManager.AddInputParamToCommand(productInsertCommand, "质量", OleDbType.Single);
            DataBaseManager.AddInputParamToCommand(productInsertCommand, "分类", OleDbType.VarWChar);
            DataBaseManager.AddInputParamToCommand(productInsertCommand, "建议售价", OleDbType.Single);
            DataBaseManager.AddInputParamToCommand(productInsertCommand, "备注", OleDbType.VarWChar);
            commands.InsertCommands.Add(productInsertCommand);

            OleDbCommand storageInsertCommand = new OleDbCommand();
            storageInsertCommand.CommandText = "INSERT INTO storage (产品编号, 仓库编号, 数量) select max(编号),0,? from product";
            storageInsertCommand.CommandType = CommandType.Text;
            DataBaseManager.AddInputParamToCommand(storageInsertCommand, "库存总数", OleDbType.Integer);
            commands.InsertCommands.Add(storageInsertCommand);

            OleDbCommand productUpdateCommand = new OleDbCommand();
            productUpdateCommand.CommandText = @"UPDATE `Product` SET `型号` = ?, `适用机型` = ?, `出厂价` = ?, 质量 = ?, `分类` = ?, `建议售价` = ?, `备注` = ? WHERE ((`编号` = ?));";
            productUpdateCommand.CommandType = CommandType.Text;
            DataBaseManager.AddInputParamToCommand(productUpdateCommand, "型号", OleDbType.VarWChar, "型号");
            DataBaseManager.AddInputParamToCommand(productUpdateCommand, "适用机型", OleDbType.VarWChar, "适用机型");
            DataBaseManager.AddInputParamToCommand(productUpdateCommand, "出厂价", OleDbType.Single, "出厂价");
            DataBaseManager.AddInputParamToCommand(productUpdateCommand, "质量", OleDbType.Single);
            DataBaseManager.AddInputParamToCommand(productUpdateCommand, "分类", OleDbType.VarWChar, "分类");
            DataBaseManager.AddInputParamToCommand(productUpdateCommand, "建议售价", OleDbType.Single, "建议售价");
            DataBaseManager.AddInputParamToCommand(productUpdateCommand, "备注", OleDbType.VarWChar, "备注");
            DataBaseManager.AddInputParamToCommand(productUpdateCommand, "编号", OleDbType.Integer, "Original_编号");
            commands.UpdateCommands.Add(productUpdateCommand);

            OleDbCommand storageUpdateCommand = new OleDbCommand();
            storageUpdateCommand.CommandText = "Update storage Set 数量 =  ? where 产品编号 = ? and 仓库编号 = 0";
            storageUpdateCommand.CommandType = CommandType.Text;
            DataBaseManager.AddInputParamToCommand(storageUpdateCommand, "库存总数", OleDbType.Integer);
            DataBaseManager.AddInputParamToCommand(storageUpdateCommand, "编号", OleDbType.Integer);
            commands.UpdateCommands.Add(storageUpdateCommand);

            OleDbCommand deleteCommand = new OleDbCommand();
            deleteCommand.CommandText = "Delete from product where 编号 = ?";  // 由于已经有了级联删除,这里不需要其他命令
            deleteCommand.CommandType = CommandType.Text;
            DataBaseManager.AddInputParamToCommand(deleteCommand, "编号", OleDbType.Integer);
            commands.DeleteCommands.Add(deleteCommand);

问题在于,插入新的记录时,这样做会把“storage.数量”的默认值抹掉,storage.数量的默认值为0, 但是文本框在每次按新增按钮后,其值都是空的,如果不在文本框中进行输入,插入时就会抛出异常。
 有没有什么办法让绑定到productstorage.库存总数的文本框在每次进行新增操作时默认显示storage.数量的默认值 0  ??
------解决思路----------------------
这个在C#程序端设置,当为新增时,把对应的textbox的text属性设置为0即可。
------解决思路----------------------
动态创建的情况下,也可以处理默认值吧,你就在抓出数据的情况下,对某些列赋初始值。这个在程序端更好控制。你动态创建textbox的时候,就对他进行赋值就可以了啥。
------解决思路----------------------
这个程序中控制比较好,sql 干这个不专业,也可能完成不了。
------解决思路----------------------
引用:
如果不在文本框中进行输入,插入时就会抛出异常。

插入前不进行输入有效性检查?
家庭作业也不该这么偷懒的怎么给让视图的求和字段具有默认值