我和一些同事讨论了存储历史数据的最佳方法.目前,对于某些系统,我使用单独的表来存储历史数据,并保留当前活动记录的原始表.所以,假设我有桌子FOO.在我的系统下,所有活动记录将进入FOO,所有历史记录将进入FOO_Hist.FOO中的许多不同字段可以由用户更新,因此我希望保持对更新的所有内容的准确帐户.除了自动递增的HIST_ID之外,FOO_Hist保存与FOO完全相同的字段.每次更新FOO时,我都会在FOO_Hist中执行一个插入语句,类似于:insert into FOO_HIST select * from FOO where id = @id.
我的同事说这是糟糕的设计,因为出于历史原因我不应该有一个表的精确副本,而应该只是在活动表中插入另一条记录,并带有一个标志,表明它是出于历史目的.
是否有处理历史数据存储的标准?在我看来,我不想把我的所有历史记录都放在同一个表格中,因为它可能超过一百万条记录(我在考虑长期).
你或你的公司如何处理这个问题?
我正在使用MS SQL Server 2008,但我想保持任何DBMS的通用和任意的答案.
我的开发团队现在正在使用ASP.NET 3.5/4.0,我们的站点在IIS 7.5上运行.最近,我们一直遇到问题(大约每周一次)导致我们的ASP.NET应用程序抛出内存不足异常."解决方案"是重新启动我们网站上的应用程序池.我说"解决方案"因为它不是解决方案; 它更像是一种绷带,只是让我们的应用程序池保持在合理的状态.在我看来,一些应用程序或许多应用程序正在泄漏内存,这会随着时间的推移而累积并导致内存不足异常.虽然我可以设置IIS以定期重新启动应用程序池,但我宁愿知道如何检测内存泄漏以尝试修复程序而不是继续应用band-aids.是否有任何工具可以检测和记录ASP.NET应用程序的内存泄漏?
此外,当我们切换到使用Telerik的RAD控件时,我们真的开始看到更多这个问题.有没有其他人使用这些控件有类似的问题?
谢谢,
亚伦
我正在使用ASP.NET 4.0.
我有以下代码返回错误"无法访问已处置的对象.对象名称:'Dispose之后访问的DataContext'."
public IEnumerable<BatchHeader> GetHeaders()
{
using(NSFChecksDataContext context = DataContext)
{
IEnumerable<BatchHeader> headers = (from h in context.BatchHeaders
select h);
return headers;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将其更改为:
public IEnumerable<BatchHeader> GetHeaders()
{
using(NSFChecksDataContext context = DataContext)
{
return context.BatchHeaders.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
它会工作正常.我正在使用此方法填充RadGrid.任何人都可以解释为什么第二种方法可行但不是第一种方法?
谢谢.
我需要创建一个文件,将图像作为文本嵌入到某些记录中.我把图像写成文本时遇到了一些麻烦.我正在做的是从SQL数据库(图像类型)收集图像作为字节数组然后我通过遍历每个字节并将该字节的ASCII等效于文件写入文本文件.
在我将该图像写入文本文件之前,我必须将其转换为CCITT4格式的TIFF(以前是jpeg).为了仔细检查这是否正确完成,我还将流保存为TIFF并在"AsTiffTagViewer"中查看,这表明压缩是正确的.我能够在适当的观众中观看tiff; 但是,从文件中收集文本时,我无法查看图像.
这是代码:
byte[] frontImage = (byte[])imageReader["front_image"];
MemoryStream frontMS = new MemoryStream(frontImage);
Image front = Image.FromStream(frontMS);
Bitmap frontBitmap = new Bitmap(front);
Bitmap bwFront = ConvertToBitonal(frontBitmap);
bwFront.SetResolution(200, 200);
MemoryStream newFrontMS = new MemoryStream();
bwFront.Save(newFrontMS, ici, ep);
bwFront.Save("c:\\Users\\aarong\\Desktop\\C#DepositFiles\\" + checkReader["image_id"].ToString() + "f.tiff", ici, ep);
frontImage = newFrontMS.ToArray();
String frontBinary = toASCII(frontImage);
private String toASCII(byte[] image)
{
String returnValue = "";
foreach (byte imageByte in image)
{
returnValue += Convert.ToChar(imageByte);
}
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
正在写入文件的是frontBinary.有没有人知道什么是错的?保存的tiff是正确的,但是当写为ASCII文本时,完全相同的字节数组没有正确写入.
谢谢.
编辑 通过使用BinaryWriter(byte [])将图像正确写入文本已更正此问题.感谢大家的帮助!
我正在使用C#System.Drawing.Printing名称空间.我需要将文档发送到网络打印机; 但是,我们所有的网络打印机都这样命名:
r99p-printername.company.com
设置我的PrintDocument对象的打印机名称,根据MSDN文档,我需要使用\\ servername\printername.我的网络管理员向我保证,没有一台打印机有这个,我只能使用上述网络打印机的命名约定.当我在我的应用程序中尝试使用它时,我得到"访问打印机的设置无效".
有任何想法吗?
谢谢.
我正在写一个应用程序将一些图像发送给第三方,图像必须是200x200 DPI.图像是位图,大小为500宽度和250高度.
我第一次用第三方测试图像时,我的分辨率不正确.我只是习惯image.SetResolution(200,200)将其正确设置为200x200.但是,这只是改变了图像的分辨率标签并且没有正确,根据我的第三方技术联系人,调整图像的高度和宽度.
是否有一个比例,我可以使用,以便每增加一个分辨率的X单位,我只增加相应的高度或宽度Y单位?我认为我可以增加分辨率而不必增加高度或宽度.
谢谢你,亚伦.
我在.NET 3.5中创建了一个Windows Form可执行文件,它使用dll与扫描检查的计算机进行通信.我最终将需要从可执行文件转移到可以执行相同操作的Web窗体.这将是几个月后,但我想现在开始做研究,因为我之前没有这样做过.我将需要使用ActiveX才能通过Web窗体与设备进行通信.我以前也没有这样做过.
我想保留现有可执行文件的功能而不必重写大部分功能,尽管我知道其中一些需要重写.我已经完成了关于ActiveX以及如何使用它的研究,但我想知道是否有人有类似的情况.你做了什么来将exe转换为web程序?是否存在我所忽视的优秀,具体的资源,可以为我指出这种情况的正确方向?你有什么建议可以帮助我减少错误吗?我工作的公司以前没有其他任何人这样做过,所以我必须自己教所需要做的一切.
提前致谢.
我有一个用C#.NET 3.5编写的WinForms应用程序.此应用程序与SQL Server 2008交互.每当我将记录添加到数据库中时,我DateAdd都会插入一个列DateTime.Now.无论出于何种原因,我有4条奇数日期的记录:
'1980-01-03 23:08:43.970'
'1980-01-03 23:08:44.157'
'1980-01-03 23:08:44.530'
'1980-01-03 23:08:45.547'
Run Code Online (Sandbox Code Playgroud)
这些之前和之后的记录都有适当的日期'2011-05-29 XX:XX:XX.XXX'.用户无权修改任何应用程序中的日期字段.
是否有任何理由认为日期会像这样改变?用户无权修改系统时间,我假设是DateTime.Now收集日期的地方.
基本上,我得出的结论是,有一个错误,或者用户有一个完全配备了助焊剂电容器的Delorean ......
我刚刚阅读了一个关于如何在.NET中向SqlCommand添加参数的问题,它为我提出了一个问题.在我的所有程序中,这是我向命令添加参数的方法:
SqlCommand cmd = new SqlCommand(cmdText,conn);
cmd.Parameters.Add(new SqlParameter("@name",value));
Run Code Online (Sandbox Code Playgroud)
我知道您也可以通过以下方式添加参数:
cmd.Parameters.Add(name, dbType, size).Value = value;
Run Code Online (Sandbox Code Playgroud)
以下哪种添加参数的方法更好?有关系吗?我知道使用Sql命名空间对SQL Server查询更有效,所以我的第一个响应是使用SqlParameter会更有效.但是,由于它已经是一个SqlCommand,我对此并不十分肯定.此外,由于使用SqlParameter实例化一个新对象,是否会使其效率低于其他情况?
我正在尝试为我的RadGrid添加自定义过滤器.我有一个专栏,vendNum,我想让用户使用以逗号分隔的列表过滤多个vendNum.基本上,我想要与SQL中的"in"语句相同的功能(其中vendNum在(X,Y,Z)中).
我按照本网站上的教程,提出了以下代码放在我的RadGrid1_ItemCommand事件中.
protected void RadGrid1_ItemCommand(object source, GridCommandEventArgs e)
{
if (e.CommandName == RadGrid.FilterCommandName)
{
Pair filterPair = (Pair)e.CommandArgument;
switch (filterPair.Second.ToString())
{
case "vendNum":
TextBox tbPattern = (e.Item as GridFilteringItem)["vendNum"].Controls[0] as TextBox;
if (tbPattern.Text.Contains(","))
{
string[] values = tbPattern.Text.Split(',');
if (values.Length >= 2)
{
e.Canceled = true;
StringBuilder newFilter = new StringBuilder();
for (int i = 0; i < values.Length; i++)
{
if (i == values.Length - 1)
newFilter.Append("[vendNum] = " + values[i]);
else
newFilter.Append("[vendNum] = " + values[i] …Run Code Online (Sandbox Code Playgroud) 我正在创建一个二进制文件,以传输给第三方,其中包含有关每个图像的图像和信息.该文件使用记录长度格式,因此每条记录都是特定长度.每条记录的开头是记录长度指示符,长度为4个字符,表示Big Endian格式的记录长度.
我正在使用BinaryWriter写入文件,而对于记录长度指示器,我正在使用Encoding.Default.
我遇到的问题是一条记录中有一个字符显示为"?" 因为它无法识别.我为记录长度指示器构建字符串的算法是这样的:
private string toBigEndian(int value)
{
string returnValue = "";
string binary = Convert.ToString(value, 2).PadLeft(32, '0');
List<int> binaryBlocks = new List<int>();
binaryBlocks.Add(Convert.ToInt32(binary.Substring(0, 8), 2));
binaryBlocks.Add(Convert.ToInt32(binary.Substring(8, 8), 2));
binaryBlocks.Add(Convert.ToInt32(binary.Substring(16, 8), 2));
binaryBlocks.Add(Convert.ToInt32(binary.Substring(24, 8), 2));
foreach (int block in binaryBlocks)
{
returnValue += (char)block;
}
Console.WriteLine(value);
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
它占用记录的长度,将其转换为32位二进制,将其转换为8位二进制块,然后将每个块转换为适当的字符.此处返回的字符串确实包含正确的字符,但是当它写入文件时,一个字符无法识别.这就是我写它的方式:
//fileWriter is BinaryWriter and record is Encoding.Default
fileWriter.Write(record.GetBytes(toBigEndian(length)));
Run Code Online (Sandbox Code Playgroud)
也许我使用了错误的编码类型?我尝试过UTF-8,它应该可以工作,但它有时给我额外的字符.
在此先感谢您的帮助.
我正在尝试从FTP服务器检索文件列表,但我得到了一些奇怪的非ASCII响应.
这是我正在使用的代码:
public string[] getFileList(string mask)
{
if(!logined)
{
login();
}
Socket cSocket = createDataSocket();
this.getSslDataStream(cSocket);
sendCommand("PASV");
sendCommand("LIST " + "*"+mask);
stream2.AuthenticateAsClient(remoteHost,
null,
System.Security.Authentication.SslProtocols.Ssl3 |
System.Security.Authentication.SslProtocols.Tls,
true);
if(!(retValue == 150 || retValue == 125))
{
throw new IOException(reply.Substring(4));
}
StringBuilder mes = new StringBuilder();
while(true)
{
int bytes = cSocket.Receive(buffer, buffer.Length, 0);
mes.Append(ASCII.GetString(buffer, 0, bytes));
if(bytes < buffer.Length)
{
break;
}
}
string[] seperator = {"\r\n"};
string[] mess = mes.ToString().Split(seperator, StringSplitOptions.RemoveEmptyEntries);
cSocket.Close();
readReply();
if(retValue != 226)
{
throw new IOException(reply.Substring(4)); …Run Code Online (Sandbox Code Playgroud)