|
I tend to think of Properties.Settings.Default as being "persistent" for a given user / client machine; not something that is restored from a database.
For your case I would consider using System.Windows.Application and its "Properties" property to store and access your settings object(s). Application.Properties is a thread-safe dictionary.
You may want to define some public static wrapper methods (somewhere) to standardize access and facilitate black-box testing.
|
|
|
|
|
Well that looks like what I was looking for. If it is thread safe, all the better, I can use that in any application, whether it is a gui or a service. I want to use the same 'framework' to speed my app dev. What I am doing now is I load up application settings from a database table and use this in the app. ( same settings table for all the apps in one area of the company, a column for app name)
I suppose the application properties can use a reference to any object? I not only have some value types, but I also have object types such as arrays, dictionnaries and lists. Would those also work in the application.properties property?
THanks a bunch, that was helpful.
|
|
|
|
|
Yes; you can store any type of object; just like the "Tag" property on most controls; or like "Sender" on events.
For a reference type, you can use it like this:
MySettings settings = Application.Current.Properties["Settings"] as MySettings;
Use a cast for simple value types.
|
|
|
|
|
Hi,
Unless I am missing something, this properties property is for a WPF object. In my case this is a plain old forms app.
If I add a static member in the Program class in program.cs would this do the trick properly? is this a proper method of doing things? The other option could be to create a static class in the namespace that has the objects containing the data I use. I am not sure what the right way is...
|
|
|
|
|
(Yes; that was a WPF class ... I assumed too much).
You can get the same functionality as WPF Application.Current.Properties using a ConcurrentDictionary from the System.Collections.Concurrent namespace; i.e. a thread-safe dictionary that can be keyed using a string and can have object values; e.g.
public static ConcurrentDictionary<string,object> MySettings = new ConcurrentDictionary<string,object>();
MySettings[ "Now" ] = DateTime.Now;
Don't know about "proper", but when I build something that is going to be used in multiple apps, I tend to create a "class library" (i.e. DLL) and reference that. I might give the above its own class so that I can standardize access using get/set instead of having a consumer use string keys.
|
|
|
|
|
After giving it some thought and using good old google, I was reading about static classes vs singleton designs.
I decided to use a singleton class. I defined the class inside a separate file to keep it modular. Inside my class I have the properties I need. Initially the properties that are objects are null. They are they populated when the application runs its startup stuff.
I am also including utility functions, such as a write to logfile function, since it uses a log directory setting in the class.
The ConcurrentDictionary sounds like a great idea to put all my settings in. It could make my class completely portable to any future apps I will write.
Your opinion on this design?
Thanks a lot for the help!
|
|
|
|
|
I've seen different "patterns" for implementing singletons ...
You can have a static class that has a static constructor for initializing static fields / properties. The static constructor is called only once and at the time when the class is first referenced.
If I have a static property referencing an object that is instantiated in the static constructor with a private setter and a public getter, then in my way of thinking I have a "singleton" using a static class.
That meets my requirements; and I like the static methods in this case.
|
|
|
|
|
You can also use a Lazy singleton for thread safety. This also has the inherit benefit of lazy instantiation.
public class MyStaticSingleton
{
#region Instance Control
private static Lazy<MyStaticSingleton> _instance =
new Lazy<myStaticSingleton>(() => new MyStaticSingleton());
private MyStaticSingleton(){}
public static MyStaticSingleton Instance
{
get { return _instance.Value; }
}
#endregion
#region Properties, methods, etc...
...
#endregion
}
|
|
|
|
|
I am trying to modify a PerformanceCounter I have created in C#. But it doesn't seem to be that it is being changed. This counter needs actualy to be a flag : 0 or 1.
I took the following code from the codeproject. It created the collectors category along with the counters well. But the RawValue always shows 0!
I am working on Win7/64.
Can you advise please?
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace PerformanceCounterSample
{
class PerformanceCounterSampleStarter
{
[DllImport("Kernel32.dll")]
public static extern void QueryPerformanceCounter(ref long ticks);
<pre>
[STAThread]
static void Main(string[] args)
{
PerformanceCounterSample test = new PerformanceCounterSample();
Random rand = new Random();
long startTime = 0;
long endTime = 0;
for (int i=0; i<1000; i++)
{
QueryPerformanceCounter(ref startTime);
System.Threading.Thread.Sleep(rand.Next(500));
QueryPerformanceCounter(ref endTime);
test.DoSomeProcessing(endTime - startTime);
}
}
}
public class PerformanceCounterSample
{
private PerformanceCounter m_cntrJoinConctConf_VPG_MyJamboLogin;
public PerformanceCounterSample()
{
if (!PerformanceCounterCategory.Exists("JamboCpmTool"))
{
CounterCreationDataCollection counters = new CounterCreationDataCollection();
CounterCreationData VPG_MyJamboLogin = new CounterCreationData();
VPG_MyJamboLogin.CounterName = "JoinConnectConf_VPG_MyJamboLogin";
VPG_MyJamboLogin.CounterHelp = "Join Connect Conf VPG MyJambo Login Success";
VPG_MyJamboLogin.CounterType = PerformanceCounterType.NumberOfItems64;
counters.Add(VPG_MyJamboLogin);
// create new category with the counters above
System.Diagnostics.PerformanceCounterCategory.Create("JamboCpmTool", "Sample category for Codeproject", PerformanceCounterCategoryType.SingleInstance, counters);
}
// create counters to work with
m_cntrJoinConctConf_VPG_MyJamboLogin = new PerformanceCounter();
m_cntrJoinConctConf_VPG_MyJamboLogin.CategoryName = "JamboCpmTool";
m_cntrJoinConctConf_VPG_MyJamboLogin.CounterName = "JoinConctConf_VPG_MyJamboLogin";
m_cntrJoinConctConf_VPG_MyJamboLogin.MachineName = ".";
m_cntrJoinConctConf_VPG_MyJamboLogin.ReadOnly = false;
m_cntrJoinConctConf_VPG_MyJamboLogin.RawValue = 0;
}
///
/// Increments counters.
///
/// <param name="ticks" />The number of ticks the AverageTimer32 counter must be incremented by
public void DoSomeProcessing(long ticks)
{
m_cntrJoinConctConf_VPG_MyJamboLogin.RawValue = 100L;
Console.WriteLine("m_cntrJoinConctConf_VPG_MyJamboLogin = " + m_cntrJoinConctConf_VPG_MyJamboLogin.RawValue);
}
}
}
|
|
|
|
|
how to make Textbox for numbers with a comma thousand seperator and can clear this C#
|
|
|
|
|
Try a NumericUpDown instead.
|
|
|
|
|
|
|
I have a code that selects from table only rows selected by a query using WHERE clause. But, I receive:
no such column : rowbegin
But in my table I have that column which value is '1' and is int type. Code for selection is this:
using (Conexiune.getConnection())
{
string select = "SELECT * FROM questions WHERE id = rowbegin LIMIT 1";
SQLiteCommand cmd = new SQLiteCommand(select, Conexiune.getConnection());
cmd.CommandType = CommandType.Text;
SQLiteDataReader rdra = cmd.ExecuteReader();
try
{
while (rdra.Read())
{
textBox1.Text = rdra["question"].ToString();
textBox2.Text = rdra["answer1"].ToString();
textBox3.Text = rdra["answer2"].ToString();
textBox4.Text = rdra["answer3"].ToString();
r1 = (int)rdra["option1"];
r2 = (int)rdra["option2"];
r3 = (int)rdra["option3"];
corect = (int)rdra["indexyes"];
incorect = (int)rdra["indexno"];
currentrow = Convert.ToInt32(rdra["id"]);
SimulatorManager.Intrebare = textBox1.Text;
label11.Text = currentrow.ToString();
label4.Text = corect.ToString();
label6.Text = incorect.ToString();
}
}
catch (InvalidOperationException ex)
{
MessageBox.Show(ex.Message);
}
}
Why it doesn't recognise my column? If I replace rowbegin in query with a value, it works.
|
|
|
|
|
You don't have a column in your table that's named "rowbegin".
I get the feeling that you're trying to pass in a row number in a variable called rowbegin but it's not possible to tell because you haven't shown all the relevant code, including the function header.
Well, just because you mention a variable name in a string does NOT mean that your variable name will get replaced by the actual value.
I highly recommend that you brush up on how strings work and you read about SQL Injection attacks and learn how to pass parameters into your SQL query the correct way before you get into any bad habits.
Change the SQL query to accept a parameter and then add your rowbegin value as a SqliteParameter object.
Start reading these[^].
|
|
|
|
|
That is the entire code, your explanation is irrelevant. I just want to select from table some data with that code and replace labels with values from table. I have in other form the same code with id = indexrow and indexrow is the same as rowbegin . I had the same issue with indexrow but I simply changed the name of the column and it worked. I tried that with rowbegin but unsuccessfully.
|
|
|
|
|
I already said that I had to make some assumptions because you didn't include all the relevant code. No, you didn't include the function header that your posted code was sitting in.
What I said IS relevant in the case that rowbegin was POSSIBLY a locally defined variable in the function. But since you didn''t supply the function header or provide ANY information at all on what rowbegin is, certain assumptions had to be made to give any kind of POSSIBLY relevant information.
Well, the problem still stands. The entire problem comes from what is rowbegin . The database engine is saying that it is not a column name in your ''questions'' table, so what is it and where is it defined?
|
|
|
|
|
Well that's the problem. rowbegin is the name of the column from questions tabel and it has a value. The code should simply select all questions where row id is equal with rowbegin value. Example: if id is 5, and rowbegin from 5 row has value 5, than select that row and show informations from all columns. What exactly is not clear? I just don't get what you don't understand..
|
|
|
|
|
DPaul1994 wrote: Well that's the problem. rowbegin is the name of the column from questions tabel and it has a value.
Well, the database engine is telling you it's not. That's the problem YOU have to diagnose. We can't see your screen, read your hard drive, get to the database engine, ... nothing.
This one is entirely on you. Did you spell the table name and column names in the SELECT query EXACTLY correct? Do you have tables with very similar names? These and others are the questions that only you can answer.
|
|
|
|
|
Everything is correct, if I replace id = rowbegin with anything else, is ok. Also, I have the same code in other form and there is ok. I told you what error I receive. Is not recognised my column and I don't know why.
|
|
|
|
|
And I told you exactly why that error shows up and what to look at.
|
|
|
|
|
I see, ok. Thank you for your time
|
|
|
|
|
Requirement: 1) creating split zips file in multiple segments(say size - 1 GB/500 MB), so that they can be downloaded through browser. The total zip volume of all the segments could exceed 10 GB 2) the zip content could be multiple files or a folder containing sub folders and files 3) the content of the file are read from Cloud in the form of stream. The meta information for the files(like folder hierarchy) are locally available
I am using DotNetZip library to achieve the task. The code is as following:
long length = default(long);
Stream fileReadStream;
long Space = default(long);
string tempZipFile = string.Empty;
FileZipStatus oldStatue = new FileZipStatus();
byte[] Buffer = new byte[1024 * 1024];
if (zipFileName != null && !zipFileName.ToUpper().EndsWith(".ZIP")) zipFileName += ".zip";
string strTempFolder = "";
using (Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile())
{
try
{
strTempFolderPath = tempZipOutPutFilePath + "\\";
string strTempFolderName = DateTime.Now.Ticks.ToString();
strTempFolder = strTempFolderPath + strTempFolderName;
if (userFileList.Count > 0)
{
if (Directory.Exists(strTempFolder))
{
Directory.Delete(strTempFolder);
}
Directory.CreateDirectory(strTempFolder);
}
foreach (UserFile userFile in userFileList)
{
WebResponse response = null;
try
{
WebRequest request = null;
IDictionary<string, object> _dictionary = new Dictionary<string, object>();
FileSystemEnum fileSysEnum = FileSystemBase.GetFileSystemEnumByStorageId(userFile.StorageId);
IFileSystemLib ifileSystemLocal = FileSystemFactory.GetSpecificInstance(fileSysEnum);
fileReadStream = ifileSystemLocal.GetFile(userFile.FilePath, userFile.GuidName, ref request, ref response, _dictionary);
long filesize = default(long);
long.TryParse(ifileSystemLocal.GetFileContentLength(userFile.FilePath, userFile.GuidName).ToString(), out filesize);
Space = (Space > default(long)) ? (Space + filesize) : filesize;
int dataToRead;
FileStream writeStream = new FileStream(strTempFolder + "\\" + userFile.FileName, FileMode.Create, FileAccess.Write);
while ((dataToRead = fileReadStream.Read(Buffer, 0, Buffer.Length)) > 0)
{
writeStream.Write(Buffer, 0, dataToRead);
}
writeStream.Close();
zip.AddFile(strTempFolder + "\\" + userFile.FileName, userFile.RelativePath);
fileReadStream.Close();
}
catch (Exception ex)
{
LogManager.Trace(ex, "ZIpping Block - ZIPFileName", zipFileName + "File to zip" + userFile.GuidName);
}
finally
{
if (response != null) response.Close();
}
}
}
catch (Exception ex)
{
_currentStatus = FileZipStatus.NotAvailable;
oldStatue = UpdateZipStatus(ObjectZipID, Space, FileZipStatus.Failed);
throw ex;
}
finally
{
}
try
{
zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G");
zip.MaxOutputSegmentSize = 200 * 1024 * 1024;
zip.Save(strTempFolderPath + "\\" + zipFileName);
oldStatue = UpdateZipStatus(ObjectZipID, Space, FileZipStatus.Available);
length = new FileInfo(strTempFolderPath + "\\" + zipFileName).Length;
_currentStatus = FileZipStatus.Available;
Directory.Delete(strTempFolder, true);
}
catch (Exception ex)
{
_currentStatus = FileZipStatus.NotAvailable;
oldStatue = UpdateZipStatus(ObjectZipID, Space, FileZipStatus.Failed);
length = default(long);
throw ex;
}
}
There are a limitation of the DotNetZip libray used in the above code. It either needs a) files saved on disk as input. In that case folder hierarchy information could be passed for each file. or 2) if stream is passed as input, folder hierarchy information could NOT be passed for file.
I need to pass in the folder hierarchy information for each file as well as read the input from stream. As the zip content could be huge(could exceed 10 GB), do not want to save the files on temporary storage in web server. Can Anyone help like how to pass folder hierarchy when creating zip file? thanks
tbhattacharjee
|
|
|
|
|
It would be rather unlogical to do this in memory; chances are that the server has more disk space available then it has memory. If it runs out of memory, the server will still use a file - as everything is pushed to the swap-file.
Do it on the filesystem.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
I did something a bit like this in a WebDav server and i can see the advantage of zipping up files to increase the speed but you won't gain much on large Avi files because they have already been compressed.
One size will not fit all here and i think you would be best off zipping up the folders to include hundreds of little files but then sending the big files say over 200mb one file at a time.
Streaming 2gb movie files can be a bit hit and go in a single stream and then buffering it up in memory to unzip so maybe look at something that can return chunks of big files with a starting offset like FTP now uses
Good luck, not an easy one
|
|
|
|