我正在使用Yii框架开发一个应用程序,我需要在保存到数据库之前临时存储数据。
屏幕分为主屏幕和细节。
使用CGridview显示细节部分。
我想暂时将数据存储在CGridview中,当点击保存按钮时,它将存储到数据库中。临时数据应该是可编辑的,可以删除。
我想过将它存储在会话中,但是如何为行生成新的主键ID?
还清空表,然后将CGridview中的所有值插入到表中是不可能的,因为我将这些ID链接到相同数据的历史表。
我该怎么做?
请帮忙。
答案 0 :(得分:0)
如果您使用的框架允许,我建议在从属表视图中的新行呈现给用户之前从数据库中检索(并保留)下一个主键值,并在行所用时使用它存储在数据库中(以及引用主表视图行的其他行)。 为此,您可以指定主键列应接受来自特定序列的值,以保证其唯一性。
如果您的表已经存在且您不想重新创建它,其中一种方法是遵循以下步骤:
创建一个起始值大于最大现有主键值的序列,并将序列与主键列相关联,例如:
创建序列foo_id_seq START with 1000; ALTER TABLE foo ALTER COLUMN id SET DEFAULT nextval('foo_id_seq');
确保所有新行都从该序列中获取主键值。下一个序列值可以通过以下方式获得:
SELECT nextval('foo_id_seq');
这些文档中的更多信息: http://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL http://www.postgresql.org/docs/current/static/sql-createsequence.html
答案 1 :(得分:-1)
试试这样.. 用于存储数据温度的变量。
_myAttachments = new Dictionary<int, byte[]>();
并将数据附加到临时变量
private void UploadAttachment(DataGridViewCell dgvCell)
{
if (DataGridView.SelectedCells.Count == 1 && DataGridView.SelectedCells[0].ColumnIndex == 2)
{
using (OpenFileDialog fileDialog = new OpenFileDialog())
{
//Set File dialog properties
fileDialog.CheckFileExists = true;
fileDialog.CheckPathExists = true;
fileDialog.Filter = "All Files|*.*";
fileDialog.Title = "Select a file";
fileDialog.Multiselect = false;
if (fileDialog.ShowDialog() == DialogResult.OK)
{
FileInfo fileInfo = new FileInfo(fileDialog.FileName);
byte[] binaryData = File.ReadAllBytes(fileDialog.FileName);
DataGridView.Rows[dgvCell.RowIndex].Cells[2].Value = fileInfo.Name;
if (_myAttachments.ContainsKey(dgvCell.RowIndex))
_myAttachments[dgvCell.RowIndex] = binaryData;
else
_myAttachments.Add(dgvCell.RowIndex, binaryData);
}
}
}
}