The LINQ to MSI implementation in DTF is known to have issues, is not
well-tested, and is not anywhere close to the quality of the rest of DTF. You
should not rely on it for production code.
I had intended to improve it eventually, but a full-featured LINQ
implementation is a major undertaking and there have been more important things
to work on.
From: Matt Ziegler [mailto:[email protected]]
Sent: Tuesday, May 19, 2009 8:28 AM
To: Windows Installer XML toolset developer mailing list
Subject: Re: [WiX-devs] RecordStream and invalid handles
Update: This seems to be related to a race condition in DTF's implementation
of Linq. The invalid handle exception manifests itself sometime after a linq
query is performed. The error seems to happen earlier or later depending on
the amount of time that the linq query takes. If I remove the linq query all
together everything runs fine. The linq query is a simple query to a custom
table. Any ideas from anyone? Linq is much nicer and smoother than running
ExecuteSqlQuery. The linq code is below.
Thanks
Matt
var sqldbs = from r in database[WixTableName]
select
new
{
key = r[WixKeyColumn],
server = r["Server"],
port = r["Port"],
database = r["Database"],
user = r["User"],
password = r["Password"]
};
foreach (var sqldb in sqldbs)
{
SqlDatabase db =
FactoryMethods.Instance.CreateDatabase(WixTableName, sqldb.key);
db.Server = sqldb.server;
short port;
if (short.TryParse(sqldb.port, out port))
db.Port = port;
db.Database = sqldb.database;
db.Username = sqldb.user;
db.Password = sqldb.password;
this.List.Add(db);
}
On Mon, May 18, 2009 at 11:05 AM, Matt Ziegler
<[email protected]<mailto:[email protected]>> wrote:
I'm using a view on a binary table to stream out a binary entry to a byte
array. After the stream is retrieved the database handle is then invalid. I
can check this by adding a watch for session.Database.Tables.Count. Below is
the piece of code that causes the behavior. Is this a bug for am I just
performing this operation incorrectly?
Thanks
Matt
using (View binaryView = session.Database.OpenView("SELECT `Data` FROM `Binary`
WHERE `Name` = '{0}'", binaryKeyName))
{
binaryView.Execute();
using (Record r = binaryView.Fetch())
{
if (r != null)
{
using (MemoryStream ms = new MemoryStream())
{
using (Stream s = r.GetStream("Data"))
{
int bufLength = 32768; //32K
byte[] buffer = new byte[bufLength];
int chunk;
int read = 0;
while ((chunk = s.Read(buffer, 0,
bufLength)) > 0)
{
ms.Write(buffer, 0, chunk);
read += chunk;
}
}
}
}
else
throw new Exception(string.Format("There must be a
binary entry '{0}'", binaryKeyName));
}
------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables
unlimited royalty-free distribution of the report engine
for externally facing server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
WiX-devs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wix-devs