|
|
Hi,
I want to connect to an ASP.NET Membership database from a command line as I need to list the user details.
The code I've come up with will connect to a named database easily enough but a membership database is local to an ASP.NET web site so I don't really know what to do. I can locate the MDF and log files easily enough but the database name can't be seen in Management Studio unless I attach to it and I need the database name to get the database owner so that I can then attach to the databse.
If I attach to it in Management Studio, the database name appears to be a large string including the absolute path, but there must be a way of deriving the database name from the MDF file itself, surely?
If I use the name I find in Management Studio I get an error message stating that I can't attach a database with the same name as an existing one! This is when the database is attached in Management Studio. I then detach it in Management Studio, run my code again and when it tries to get the database owner by specifying the database name in the Server.Databases list, I get an unreferenced object error. I'm completely confused!
So what I want to know is, how to I connect to a database using only its MDF file (and LDF file if necessary)?
Thanks
|
|
|
|
|
Server=.\SQLExpress;
AttachDbFilename=|DataDirectory|mydbfile.mdf;
Database=dbname;
Trusted_Connection=Yes; Source: http://connectionstrings.com/sql-server-2005[^]
The list of names in the Management-Studio are "aliases", short names that point to a file. If you attach a file, make sure to give it an non-existing alias. I usually try to deduce one based on the file-name.
You could use SMO to check what database-names are already in use
I are Troll
|
|
|
|
|
Thanks, I'll try that. I didn't realise that to attach a database I'd have to supply my own name.
The issue with that connection string you quote though, is that it specifies "DataDirectory" as though my application was a web-based one and that it had access to a local directory, "App_Data". I'm guessing then that I'll have to create a connection string which includes the full path of the MDF file and use that. It's then just about whether I can get the Membership object to reference the chosen database.
|
|
|
|
|
I am extracting 378000 BLOBS from a database.
This is mostly pdf,doc, and docx, but also some big wav,tiff,mpg, ++.
The code I'm currently using is a bit slow..
Does anyone have a tip on how to speed things up?
using (r2d2 = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess))
{
if (!r2d2.HasRows)
throw new Exception();
DirectoryInfo dir = new DirectoryInfo(Path.Combine(_arbeider.KonverteringsAlternativer.RootOutputDirectory, "DOKUMENT"));
if (!dir.Exists)
dir.Create();
while (r2d2.Read())
{
string filnavn = Convert.ToString(r2d2["filename"]);
string sizeString = Convert.ToString(r2d2["size"]);
int size = 0;
bool sizeOK = int.TryParse(sizeString, out size);
bool filnavnOK = false;
try
{
new System.IO.FileInfo(filnavn);
filnavnOK = true;
}
catch (ArgumentException erna)
{
throw new Exception("file not valid");
}
catch (System.IO.PathTooLongException)
{
throw new Exception("path not valid");
}
catch (System.Exception errrr)
{
throw new Exception("filename not supported", errrr);
}
if (filnavnOK && sizeOK && size > 0)
{
FileStream fs = null;
BinaryWriter bw = null;
if (_hashBrukteFilnavn.ContainsKey(filnavn))
filnavn = Path.GetRandomFileName().Substring(0, 5) + filnavn;
_hashBrukteFilnavn[filnavn] = true;
try
{
fs = new FileStream(Path.Combine(dir.FullName, filnavn), FileMode.OpenOrCreate, FileAccess.Write);
bw = new BinaryWriter(fs);
completePath = Path.Combine(dir.Name, filnavn);
int startIndex = 0;
int buffersize = 3072;
byte[] outbyte = new byte[buffersize];
long retval = r2d2.GetBytes(2, startIndex, outbyte, 0, buffersize);
while (retval == buffersize)
{
bw.Write(outbyte);
bw.Flush();
startIndex += buffersize;
retval = r2d2.GetBytes(2, startIndex, outbyte, 0, buffersize);
}
bw.Write(outbyte, 0, (int)retval);
}
catch (System.Exception err)
{
throw new Exception("error");
}
finally
{
if (bw != null)
{
bw.Flush();
bw.Close();
}
if (fs != null)
{
fs.Close();
fs.Dispose();
}
}
}
else
throw new Exception("file not valid");
}
}
|
|
|
|
|
Hi,
I would use a buffersize that is a multiple of 1K (1024), much larger than what you have, say 64K. And I wouldn't flush the BinaryWriter that often, once every MB or so is enough.
|
|
|
|
|
So if default packet size for MSSQL 2008 is 4096 (Kbytes?), I could for example try to use 2048 Kbytes wich gives me:
buffersize = 1024*2048=2097152?
And if I want to flush every MB, something like this? :
int startIndex = 0;
int buffersize = 2097152;
byte[] outbyte = new byte[buffersize];
long retval = r.GetBytes(2, startIndex, outbyte, 0, buffersize);
while (retval == buffersize)
{
bw.Write(outbyte);
if(startIndex%1048576==0)
bw.Flush();
startIndex += buffersize;
retval = r.GetBytes(WriterTabell.Reader.GetOrdinal("nef_elfil"), startIndex, outbyte, 0, buffersize);
}
bw.Write(outbyte, 0, (int)retval);
With this code I usually get only 1 loop wich seems to be faster
Is there any way I can find the optimal buffersize? Can .NET do the job for me (without using DataSet)?
|
|
|
|
|
Hi,
I would:
- use a smaller buffer (64KB, maybe 256KB), no need to waste 2MB;
- not write strange constants, just write it as you mean it 64*1024 , the compiler or JIT will evaluate it once for you;
- maybe flush every 16th iteration of the loop, so make it a for:
for(int iter=0; retval==buffersize; iter++) {
...
if ((iter%16)==0) bw.Flush();
...
}
Thomas ST wrote: any way I can find the optimal buffersize?
by experiment, however it won't matter much once you get it large enough, and it will vary depending on system specs and maybe system load.
Thomas ST wrote: Can .NET do the job for me (without using DataSet)?
don't know.
|
|
|
|
|
I don't have time to experiment
I'm going for a buffersize of 256*1024 (and I will let the compiler do the math ), and flushing every iter%16==0. The example I found online had buffersize=255 (equals 255 bytes right?), but it appears to be much faster with a bigger buffersize! It also seems like avoiding flush() is a good idea.
Thanks for helping me out
|
|
|
|
|
I store files as VARBINARY. To write them to disk I use:
using
(
System.IO.FileStream fs
=
fi.Open
(
System.IO.FileMode.Create
,
System.IO.FileAccess.Write
,
System.IO.FileShare.None
)
)
{
byte[] content = (byte[]) ds [ 1 ].Rows [ i ] [ "FileContent" ] ;
fs.Write ( content , 0 , content.Length ) ;
fs.Close() ;
}
The framework/OS can then buffer it as it sees fit.
(fi is a System.IO.FileInfo , ds is a System.Collections.Generic.IList<System.Data.DataTable> )
|
|
|
|
|
But then you use DataTable, doesn't this load everything into memory first?
|
|
|
|
|
Yes, and if that's a concern, just use a DataReader, which I do quite often.
|
|
|
|
|
Forgot to mention it, but yes, it's a big concern.
I'm extracting almost 120GB of files stored in aprox. 400000 BLOBs.
But thanks for suggestions
|
|
|
|
|
I am trying datagridview drag and drop itself for our application . i was tried this code
void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y);
if (info.RowIndex >= 0)
{
DataGridViewRow view = dataGridView1.Rows[info.RowIndex];
if (view != null)
dataGridView1.DoDragDrop(view, DragDropEffects.Copy);
}
}
}
void dataGridView1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
void dataGridView1_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(DataGridViewRow)))
{
DataGridView.HitTestInfo hitInfo = dataGridView1.HitTest(e.X, e.Y);
int index = hitInfo.RowIndex;
if (index >= 0)
{
DataGridViewRow baluba = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow));
if (baluba != null)
{
dataGridView1.Rows.Add(baluba);
}
}
}
}
I have the index value of DragDrop method is -1. Not get correct value and also get exception in dataGridView1.Rows.Add(baluba); The exception is "System.InvalidOperationException" ...
How can achieve this ... Please help me....
|
|
|
|
|
Dear Friends
I need to convert numeric values to string .
I'm using ASP.net and C# and database is SQL Server 2000
I Need to convert Rs 400 to Rupees Four Hundred only.
I need sample code
with thanks
Kankeyan
|
|
|
|
|
Here[^]
50-50-90 rule: Anytime I have a 50-50 chance of getting something right, there's a 90% probability I'll get it wrong...!!
|
|
|
|
|
Sounds like homework; lots of Code Projectors have submitted articles about how to do that.
|
|
|
|
|
Hello,
I need some help for this problem :
My mainform call a modal dialog, which contain a listbox, a multiline text field and a timer.
When user select a line in the listbox, the timer fire. His job is to fit some text ( string var ) into the textbox.
PB : this work fine only when the dialog is maximised or when i call first an other running program. All appp except my main form...strange !
Have anyone some suggestion ? I thanks in advance. Nicolas
nicolas@nsjs.fr
|
|
|
|
|
When you say it does not work, what exactly to you mean? Is there an error? Or can you just not type or something?
When you say i call first an other running program do you mean you activate some other application and return to your app?
|
|
|
|
|
Is the timer event called when the dialog is not modal? I guess the modal dialog block all other threads.
This statement is false.
|
|
|
|
|
What is the Timer supposed to do?
|
|
|
|
|
Hello, thanks for the interest. Is the dialog modal or not, the result is the same. The tick event's job is only to put a string in the multiline textbox. Here my calling code :
gpsInput = new Form5();
gpsInput.TopMost = false;
gpsInput.Visible = false;
gpsInput.ShowInTaskbar = false;
gpsInput.dlgevent += new Form5.infoevent(gpsInput_dlgevent);
this.gpsInput.ShowDialog();
Here the tick events ( the button enable on/Off is only for testing this problem. The ReadPort is normally called and return the string to put into the textbox.
private void timer1_Tick(object sender, System.EventArgs e)
{
if (button2.Enabled == true)
button2.Enabled = false;
else
button2.Enabled = true;
// ReadPort();
}
I dream about ghost...
}
|
|
|
|
|
Hello, thanks to all. I have found a solution. Instead of using VisualStudio toolbox, I create the timer in my code as this lines :
timer = new System.Timers.Timer();
timer.Interval = 1000;
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Enabled = true;
with a public var timer. All things work perfectly but I don't have understand why the toolbax timer don't work. I found this solution from deusXL on developpez.net forums. Also thanks to him.
Thanks to every body for your time.
Nicolas
|
|
|
|
|
This is a question for GC experts out there:
[Please don't respond telling me to use Dispose, it's not what I'm looking for.]
I'm currently looking for ideas on how to release memory right before a generation 3 garbage collection. Specifically, I have a bunch of objects that all hold the contents of corresponding files on disk. I'd like to hold as many objects as possible in RAM and only release them as more RAM is needed.
The naive approach is to use a Dictionary of WeakReferences. This is what I'm currently doing, but the problem is that some objects never get out of generation 0, and thus are collected and then re-loaded a few seconds later.
So are there any ideas with regard to getting a good estimate of when a garbage collection is coming so I can move unused objects into WeakReferences?
Some constraints:
1 - My deployment scenario is Mono + Linux, so I can't use the Win32 API, hidden CLR functions, COM, ect, ect.
2 - I'm developing with Visual Studio 2005 Pro. I can't afford VS 2008 Pro, and 2005 has some vital threading features in the debugger that VS 2008 express lacks.
modified on Friday, December 4, 2009 5:32 AM
|
|
|
|
|
Not sure if I understood your scenario correctly, but would the dispose pattern be of any use to you?
|
|
|
|
|